DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
NomalASP.NETから呼ばれているかどうか判定する方法(3) | NomalCA2213の警告が消えません(3) | NomalSQLServerテーブル内容をDataGridViewに表示するコードについて(6) | Nomaloo4oのAddTableをADOに移行したい(5) | Nomalデータバインド時のDataGridViewのカスタムソート(2) | NomalFunction プロシージャからの文字選択(1) | NomalMicrosoft Azure OCRのサンプルコード実行時エラー(2) | Nomal文字列構造体のListのソート(6) | NomalフォームコントロールへのDataBindingsでプロパティが相互反映されない(7) | NomalC# 現在のコンテキスト内にxxxという文字は存在しませんと出ます(3) | NomalWinFormsでWindows10のカメラアプリと連携したい(0) | NomalObject型からDecimalへの変換(2) | NomalWindows10(1803)からGetHostEntryでipv4が取得出来ない場合がある(2) | Nomalユーザーコントロールのプロパティが保存されない(2) | Nomal擬似言語をVBのプログラミングに変換(2) | Nomal「Environment.SpecialFolder.MyDocuments」の戻り値(2) | Nomalエクスプローラーのポインタ下のアイテムの取得(8) | NomalGIFで使うPNGファイルにおける容量削減について(5) | NomalProcess.StartでPDFファイルが開かない(Windows10)(3) | Nomal定数を複数繰り返す時(1) | Nomaloo4oのAddTableをODP.NETに移行したい(2) | NomalWindows標準TCPIPポートについて(4) | Nomalユーザーコントロールをツールバーに表示できない(8) | Nomalレンタルサーバからファイルを取得する方法を教えてください。(12) | NomalIEnumerableについてまとめてみました。(2) | NomalスレッドのwebbrowserでDocumentCompletedが来ない(2) | NomalList(of T)の抽出方法(3) | Nomalあまりにも基本的なことですが。(3) | NomalVB.netで作成されたプログラムからAccessのレポート印刷時にバーコードが表示されない(2) | NomalTextBoxの最大バイトを超えた分の文字を消す際の不具合(2) | Nomal折れ線グラフで基準値以内と基準値超過で色変え(6) | NomalFriend設定されているdllを利用することができますか?(3) | Nomal縦横変換してのTableの合算(4) | Nomalhtmlファイルへの関連付け(2) | NomalDataTableにSQLを実行できますか?(6) | Nomal.netからのAccessパスワード解除(2) | Nomal天気.jpに切断されます(2) | Nomalgifの容量をできるだけ軽くしたい(11) | NomalVB.NETでXMLファイルからデータを取得したい(2) | NomalAddStringの使い方(5) | NomalVS2015 Express インストール時のエラー(7) | Nomal2枚のPictureBoxを合成した上で描画したい(6) | Nomal自作ツールを標準ブラウザ候補に入れるには?(3) | NomalGraphicsUnit.Document使用時に解像度に合わせて位置決めしたい(2) | Nomal文字を円弧に沿って表示させたい(5) | Nomal【お知らせ】スマホでも見やすくなりました(0) | NomalVB.NetのWebBrowserでJavaScriptを呼び出したい(2) | Nomalサムネイルを新しい順にファイル名のみで表示したい。(4) | NomalEXCELでクリップボードを使用せずに書式付きでセルをコピー(5) | NomalDataGridView内でコンボボックスの選択をキャンセルする方法(1) | Nomalタブの色を他の処理から変更する方法(2) | Nomal同じデータセット内にテーブルの複製を作る方法(4) | Nomal配列を持つ自作クラスで、入れ替える関数を作成したい。(3) | NomalPowerPointをVBAでPDF化したい(0) | Nomalvs2017のC#で”現在のコンテキストに"Console"という名前は存在しません"と表示される(2) | NomalASP.NET 数分の処理でaspxの応答が無くなる(2) | NomalCSVのTextFieldParser読込時のオリジナル1行データの取得について(2) | NomalC# enum命名規則の抜け道(2) | Nomalマルチスレッドにおける画面の更新(4) | NomalCrystalReport 実行時にレポートエラー(0) | NomalCSVファイルから指定行を1行削除したい(2) | NomalDataGridView内での集計行追加を行いたい(6) | Nomal【VB.net】特殊なキーのコードとイベント(3) | Nomal「 No33447 の投稿について、質問があります」# webbrowserでjqueryのイベントを発生させたい(3) | Nomalwebbrowserでjqueryのイベントを発生させたい(7) | NomalVB.NETでの TCPClient通信をByteのみでしょうか?(3) | Nomal仮想デスクトップのスクリーンキャプチャ(Windows10, C#)(0) | NomalVB.netでPDF-XChange Viewerの印刷設定(2) | NomalExcel オートメーションエラーとなってしまう(1) | NomalPictureBoxで動画を2回目に表示させる際に0除算エラーが起きる。(0) | NomalListViewに動画ファイルのサムネイルを表示する(2) | NomalPictureBoxに動画を表示させた後に静止画を表示させる(3) | Nomal非同期デリゲートとスレッドプール(2) | NomalフォームのボタンがONと同じようにスイッチONでも動作させたい(0) | Nomal複数の図形を重ねて描画するには(4) | NomalSNSへ自動投稿したい(2) | Nomal外部アプリケーションのアクティブ化(0) | Nomal「UDP」65535byteを超える画像データの送信(4) | Nomal画像の中心で回転させたい(3) | NomalPLCとの通信PGMの設計(1) | Nomalディスプレイの認識番号を求めたい(8) | NomalListViewの画像のドラッグアンドドロップ(14) | NomalMaskedTextBoxに丸囲み数字が入力できない(2) | NomalFTPにてリモート サーバーがエラーを返しました: (550) (1) | Nomalエンターキーでのコントロール移動(4) | Nomalメッセージの表示(1) | NomalThreading.Threadで戻り値を取得したい(8) | NomalPOSTとブラウザで動きが違うのはなぜでしょう?(6) | NomalUIスレッド使用中のBeginInvoke(5) | NomalForm起動時の例外スローが発生する原因が知りたい(1) | NomalASP.NET(VB.NET)でMapHubsを利用したい(2) | NomalForm1内のForm2でのTextBox入力がうまくいかない(6) | NomalnpgsqlでのExecuteScalarとExecuteReaderの扱いについて(2) | Nomalすきーむ りすと(2) | Nomalユーザーコントロールで自作のBackColorプロパティを使いたい(3) | NomalDataGridViewのRowLeaveのキャンセルについて(1) | Nomalプロパティウィンドウのカスタマイズ(2) | NomalCSV出力時に対象データバイト数+crlfの2バイト分のNull文字が出力される(4) | NomalIE11のダウンロード通知バーの保存を押したい(2) | Nomalmagick.net c# PDFの総ページ数取得(2) |



■記事リスト / ▼下のスレッド
■34063 / 親記事)  ASP.NETから呼ばれているかどうか判定する方法
□投稿者/ ぺんたごん 一般人(29回)-(2018/12/12(Wed) 11:45:42)
  • アイコン環境/言語:[.NET 4.5.2] 
    分類:[.NET] 

    こんにちわ。

    今回、クラスライブラリを作っています。
    これはWinForms、WPFやASP.NETなどからも使用可能なものとしています。
    ここで、ASP.NETから呼び出されたときだけ挙動を少し変えようとしていますが、
    なにか良い方法は有りますでしょうか。

    ひとつ思いついたのは、エントリとなったアセンブリ名を取得し、
    w3wp.exeだった場合はASP.NETだと判定する方法ですが、
    もしWinFormsなどでexe名がw3wpだと誤判定する問題が有ります…

    どうかよろしくお願いします。
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34064 / ResNo.1)  Re[1]: ASP.NETから呼ばれているかどうか判定する方法
□投稿者/ shu 大御所(483回)-(2018/12/12(Wed) 17:02:13)
  • アイコンNo34063に返信(ぺんたごんさんの記事)

    起動モードをパラメータとして渡すようにして、その内容で
    判断するようにしておいた方がよいと思います。


違反を報告
引用返信
■34065 / ResNo.2)  Re[1]: ASP.NETから呼ばれているかどうか判定する方法
□投稿者/ 魔界の仮面弁士 大御所(1181回)-(2018/12/12(Wed) 17:33:17)
  • アイコンNo34063に返信(ぺんたごんさんの記事)
    > ここで、ASP.NETから呼び出されたときだけ挙動を少し変えようとしていますが、

    たとえば、下記のような代替策では駄目でしょうか。

    ・.config ファイルで挙動を指定する設計にする
    ・挙動を変更するための初期化パラメーターを呼び出し元から指定できるようにする
    ・プリプロセッサにより、それぞれの呼び出し元ごとに別のアセンブリとしてコンパイルする

    > w3wp.exeだった場合はASP.NETだと判定する方法ですが、
    aspnet_wp.exe という可能性もあるかも。


    > もしWinFormsなどでexe名がw3wpだと誤判定する問題が有ります…
    (同じファイル名にする明確な理由が思い当たらなかった…)

    WinForms と ASP.NET の二択で良ければ、Environment.UserInteractive あたりが
    つかえるかもしれません。他のサービスから利用する可能性があるなら駄目ですが。

    あるいは、Principal を判定する方法もありそうですが、こちらは認証方法次第ですね。

    あとは System.Web.Hosting.HostingEnvironment.IsHosted とかかな…。


    方法を考えるにしても、その切替が必要となった理由次第と言えるので、
    どういった挙動変更をどのような目的で行いたいのかといった
    具体的な背景が分かると助かります。
違反を報告
引用返信
■34066 / ResNo.3)  Re[2]: ASP.NETから呼ばれているかどうか判定する方法
□投稿者/ ぺんたごん 一般人(30回)-(2018/12/13(Thu) 13:44:29)
  • アイコンありがとうございます。

    プロセス名については、作ってるのはあくまでライブラリなので
    誰がどんなexe名にするか不明なため最悪なパターンとして被るなぁという意味でした。
    プロパティで外から設定してもらうことにし、
    誰かがASP.NETで作ってて設定し忘れた場合は自己責任ということにします。

    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34058 / 親記事)  CA2213の警告が消えません
□投稿者/ CHIKO 一般人(1回)-(2018/12/08(Sat) 15:06:37)
  • アイコン環境/言語:[C#VS2017] 
    分類:[.NET] 

    いつも参考にさせていただいています、ありがとうございます。
    DLL参照やTimerのDisposeで困っています、宜しくお願い致します。

    Consoleアプリケーションを作成しています。
    System.Timers.Timerを2つ使用しています。
    コード分析するとwarning CA2213: Microsoft.Usage : 'XXX' は、IDisposable 型 'Timer' であるフィールド 'XXX.Timer' を含んでいます。このフィールドで Dispose または Close を呼び出すには、'XXX' の Dispose メソッドを変更してください。
    がでます。

    以下のコードを記述しておりますが、警告が消えません。何が問題なのでしょうか。
    #region IDisposable Support
    private bool disposedValue = false; // 重複する呼び出しを検出するには

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "TimerStopX")]
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "TimerError")]
    protected virtual void Dispose(bool disposing)
    {
    if (!disposedValue)
    {
    if (disposing)
    {
    if (TimerError != null) { TimerError.Elapsed -= TimerError_Elapsed; }
    if (TimerStopX != null)
    {
    TimerStopX.Elapsed -= OnTime_Stop;
    }
    ((IDisposable)TimerStopXy)?.Dispose();
    ((IDisposable)TimerError)?.Dispose();
    }
    // TODO: アンマネージド リソース (アンマネージド オブジェクト) を解放し、下のファイナライザーをオーバーライドします。
    // TODO: 大きなフィールドを null に設定します。

    disposedValue = true;
    }
    }

    // TODO: 上の Dispose(bool disposing) にアンマネージド リソースを解放するコードが含まれる場合にのみ、ファイナライザーをオーバーライドします。
    // ~HTTPSockets() {
    // // このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
    // Dispose(false);
    // }

    // このコードは、破棄可能なパターンを正しく実装できるように追加されました。
    public void Dispose()
    {
    // このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
    Dispose(true);
    // TODO: 上のファイナライザーがオーバーライドされる場合は、次の行のコメントを解除してください。
    // GC.SuppressFinalize(this);
    }
    #endregion

    }
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34059 / ResNo.1)  Re[1]: CA2213の警告が消えません
□投稿者/ 魔界の仮面弁士 大御所(1178回)-(2018/12/10(Mon) 09:18:16)
  • アイコンNo34058に返信(CHIKOさんの記事)
    > System.Timers.Timerを2つ使用しています。

    3 つあるようにも見えます。
    > TimerStopX.Elapsed -= OnTime_Stop;
    > ((IDisposable)TimerStopXy)?.Dispose();
    > ((IDisposable)TimerError)?.Dispose();



    > コード分析するとwarning CA2213: Microsoft.Usage : 'XXX' は、IDisposable 型 'Timer' であるフィールド 'XXX.Timer' を含んでいます。
    > このフィールドで Dispose または Close を呼び出すには、'XXX' の Dispose メソッドを変更してください。
    > がでます。

    この XXX というのは、「class HTTPSockets : System.IDisposable」のようなものでしょうか。
    だとしたら、「class HTTPSockets : System.ComponentModel.Component」に変更してみるとか。
    https://social.msdn.microsoft.com/Forums/ja-JP/b0430ffa-3e5e-40ae-9d79-ffb8283818f7/
違反を報告
引用返信
■34061 / ResNo.2)  Re[1]: CA2213の警告が消えません
□投稿者/ 魔界の仮面弁士 大御所(1180回)-(2018/12/10(Mon) 11:07:32)
  • アイコンNo34058に返信(CHIKOさんの記事)
    > 以下のコードを記述しておりますが、警告が消えません。

    試しに、TimerError を Private Field ではなく、
    Read-Only Property にしてみたところ、先の CA2213 警告が
    直接アクセス不能なバッキングフィールドを提示してきました。(^_^;)


     警告 CA2213 '型' は、IDisposable 型 'Timer' である
     フィールド '型.<TimerError>k__BackingField' を含んでいます。
     このフィールドで Dispose または Close を呼び出すには、
     '型' の Dispose メソッドを変更してください。


    ただし、setter が private で、getter が 非 private なプロパティにすると
    この警告は発生しませんでした。



    > ((IDisposable)TimerStopXy)?.Dispose();
    > ((IDisposable)TimerError)?.Dispose();

    「?.」がマズイみたいですね。
    VS2017 の場合、null 条件演算子 を使わなければ警告は出ませんでした。

    アナライザー側の問題のような気もするのですが、コード分析は
    既に非推奨な機能のようです。
    (VS2019 Preview 1 では、FxCop Analyzers に移行するよう促されます)



    いずれにせよ今回の場合、事前に null チェックを行っていますので、
    null 条件演算子を使う必要は無さそうです。

    if (!disposedValue)
    {
     if (disposing)
     {
      if (TimerError != null)
      {
       TimerError.Elapsed -= TimerError_Elapsed;
       TimerError.Dispose(); // TimerError?.Dispose();
       TimerError = null;
      }
      // 略
      //
      disposing = true;
     }
    }
違反を報告
引用返信
■34062 / ResNo.3)  Re[2]: CA2213の警告が消えません
□投稿者/ CHIKO 一般人(2回)-(2018/12/10(Mon) 11:23:52)
  • アイコンわざわざコーディングして調べて頂いてありがとうございます。

    ?を外したら警告が消えました!!(誤字の多いコードで大変失礼致しました)
    大変助かりました。

    >アナライザー側の問題のような気もするのですが、コード分析は
    >既に非推奨な機能のようです。
    >(VS2019 Preview 1 では、FxCop Analyzers に移行するよう促されます)

    情報ありがとうございます。VS2019がもうでているのですね。
    今後とも宜しくお願い致します。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34049 / 親記事)  SQLServerテーブル内容をDataGridViewに表示するコードについて
□投稿者/ けい 一般人(14回)-(2018/11/30(Fri) 09:49:58)
  • アイコン環境/言語:[VB2015、Windows10、.NETFramework4.6] 
    分類:[.NET] 

    お世話になります。
    VB2015、Windows10、.NETFramework4.6で開発しています。

    SQLServerにあるテーブルの内容をSQL文で取得し、
    DataGridView1に表示するコードがあります。

    下記A〜Dをそれぞれ実行すると、
    Aはエラーになりますが、
    B〜Dは、
    表示上は同じ正常表示になります。

    どのパターンを使用しても問題ないでしょうか。
    不適切な書き方があれば教えてください。

    どうぞよろしくお願いします。

    Imports System.Data.SqlClient

    Dim cn As New SqlConnection(接続文字列)
    Dim strSQL As String
    Dim da As SqlDataAdapter
    Dim dt As DataTable
    Dim ds As DataSet
    strSQL = "(SELECT文)"
    da = New SqlDataAdapter(strSQL, cn)

    -----------------------------

    da.Fill(dt)


    dt=New DataTable
    da.Fill(dt)


    ds = New DataSet
    da.Fill(ds, "(テーブル名)")
    dt = ds.Tables("(テーブル名)")


    ds = New DataSet
    da.Fill(ds, "(テーブル名)")
    dt=New DataTable
    dt = ds.Tables("(テーブル名)")

    -----------------------------

    DataGridView1.DataSource = dt
違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■34052 / ResNo.2)  Re[2]: SQLServerテーブル内容をDataGridViewに表示するコードについて
□投稿者/ けい 一般人(15回)-(2018/11/30(Fri) 12:36:52)
  • アイコンNo34051に返信(魔界の仮面弁士さんの記事)

    お詳しいご説明をありがとうございます。

    Usingは使っているのですが、
    質問文をシンプルにするために、
    Dimにして掲載しました。

    運用上はB〜DいずれでもOKなのですね。
    個人的には、DataRowも使用することが多く、
    C、Dをよく使用しています。

    他者のコードを読んでいて、
    Bのパターンがあり、
    質問させていただきました。

    また、CとDとで、
    Newのあるなしで迷いました。

    アドバイスいただきました内容を参考に、
    研究してみます。

    (バージョン)

    そうなのですね。

    Windows8のPCに、VB2015をインストールして、
    Windows10にアップデイトしたから、でしょうか。
    バージョンは下記のようになっています。

    Windows10:1803
    Visual Studio Professional 2015:14.0.23107.0 D14REL
    .NET Framework:4.7.03056

    ただ、プロジェクトのプロパティを開き、フレームワークのコンボボックスを開くと、選択可能なバージョンは、4.6.1まで、なんですよね。

    色々調べてみます。

    ありがとうございます。
違反を報告
引用返信
■34053 / ResNo.3)  Re[2]: SQLServerテーブル内容をDataGridViewに表示するコードについて
□投稿者/ けい 一般人(16回)-(2018/11/30(Fri) 12:57:33)
  • アイコンNo34051に返信(魔界の仮面弁士さんの記事)

    失礼します。

    下記のリンクの方法で、インストールされているフレームワークのバージョンを見ると、4.7.2でした。

    インストールされている .NET Framework バージョンを確認する
    https://docs.microsoft.com/ja-jp/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed

    ところが、コントロールパネルの、
    「プログラムのアンインストール又は変更」を開いてみますと、
    4.7.2が見当たりません。

    代わりに、以下のすべてが入っています。

    4.5…Multi-Targeting Pack(通常)(以下、MTP)
    4.5.1…SDK(通常、日本語)、MTP(通常、日本語)
    4.5.2…MTP(通常、日本語)
    4.6…SDK(通常、日本語)、MTP(通常、日本語)
    4.6.1…SDK(通常、日本語)、MTP(通常、日本語、ENU)

    .NET Version Manager(x64)1.0.0-beta5

    これがどういう状況なのか、明確には分かりません。

    引き続き調べてみます。

    ありがとうございます。

違反を報告
引用返信
■34054 / ResNo.4)  Re[3]: SQLServerテーブル内容をDataGridViewに表示するコードについて
□投稿者/ 魔界の仮面弁士 大御所(1176回)-(2018/11/30(Fri) 16:47:18)
  • アイコンNo34053に返信(けいさんの記事)
    > 「プログラムのアンインストール又は変更」を開いてみますと、
    > 4.7.2が見当たりません。

    そもそも Windows 8 以降では、.NET Framework が
    オペレーティング システム の必須コンポーネントとなっているため、
    個別にアンインストールすることができません。

    そのため、.NET Framework の更新バージョンがある場合にも、
    『プログラムのアンインストール又は変更』ではなく、
    『インストールされた更新プログラム』の方となります。
    https://docs.microsoft.com/ja-jp/dotnet/framework/install/troubleshoot-blocked-installations-and-uninstallations


    しかし .NET Framework 4.8 の Early Build を除けば、
    .NET Framework 4.7.2 が現時点の最新版ですので、いずれにせよ
    現時点では、更新プログラムの一覧にも記載されていない可能性が高いです。
    https://blogs.msdn.microsoft.com/dotnet/2018/11/28/announcing-net-framework-4-8-early-access-build-3694/


    なお、OS コンポーネントという性質上、確認するとすれば
    『プログラムのアンインストール又は変更』ではなく
    『Windows の機能の有効化または無効化』の方となりますが、
    これも ASP.NET 関連モジュールの有効化/無効化が行える程度であり、
    .NET Framework のアンインストールやバージョン確認目的には使えません。


    > 下記のリンクの方法で、インストールされているフレームワークのバージョンを見ると、4.7.2でした。

    そのはずです。

    Windows 10 version 1803 (April 2018 Update) に搭載されている
    .NET Framework バージョンは 4.7.2 なので、先の表とも一致しますよね。


    参考までに、オフラインインストーラーの場所も掲載しておきます。
    Windows 10 に 4.7.2 をインストールする場合、対象バージョンは
     Windows 10 version 1607 (Anniversary Update
     Windows 10 version 1703 (Creators Update
     Windows 10 version 1709 (Fall Creators Update)
    となります。(version 1803 / 1809 は既定で有効)
    https://support.microsoft.com/en-us/help/4054530/


    そのひとつ前の 4.7.1 の場合は、
     Windows 10 version 1607 Anniversary Update
     Windows 10 version 1511 Creators Update
    が対象です。(version 1709 は既定で有効)
    https://support.microsoft.com/en-us/help/4033342/


    最初に投稿いただいた 4.7 の場合は
     Windows 10 version 1607 Anniversary Update
    が対象です。(version 1703 は既定で有効)
    https://support.microsoft.com/en-us/help/3186497/



    > 4.7.2が見当たりません。

    .NET Framework 4.7.2 の入っているバージョンの Windows 10 環境であっても、
    4.7.2 Targting Pack が無ければ、4.7.2 向けの開発は行えません。

    逆に言えば、対応する Targting Pack を導入することで、
    将来バージョンの .NET Framework 開発にも対応できます。
    (Targting Pack に対応している Visual Studio は 2012 以降です)

    VS2012 / 2013 は 4.6.2 まで、
    VS2015 / 2017 は 4.7.2 までに対応します。
    https://dotnet.microsoft.com/download/visual-studio-sdks



    > 代わりに、以下のすべてが入っています。

    そこは『実行環境』と『開発環境』の違いですね。
    ランタイム バージョンが共存できるわけではありません。


    > 引き続き調べてみます。

    .NET 4.7.2 開発を行う場合には、
     (1) NDP472-DevPack-ENU.exe
     (2) NDP472-DevPack-JPN.exe
    の順でインストールする必要があるようです。

    ※VS2017 の場合。VS2015 は試していません。
違反を報告
引用返信
■34056 / ResNo.5)  Re[3]: SQLServerテーブル内容をDataGridViewに表示するコードについて
□投稿者/ 魔界の仮面弁士 大御所(1177回)-(2018/11/30(Fri) 17:22:24)
  • アイコンNo34052に返信(けいさんの記事)
    > また、CとDとで、
    > Newのあるなしで迷いました。

    D であっても、動作上は問題はありません。

    しかし D の New DataTable の行は無意味ですから、
    より適切なのは C の構文と言えますね。

    もしも Fill する前に DataTable のインスタンスが必要なのであれば、
     ds = New DataSet()
     dt1 = New DataTable("テーブル名1")
     ds.Tables.Add(dt1)
     da.Fill(dt);
    あるいは
     ds = New DataSet()
     dt2 = ds.Tables.Add("テーブル名2")
     da.Fill(dt2)
    とすることもできます。

    まぁ、事前に DataTable のインスタンスを作ってもあまり意味は無いので、
    通常は C(または B)パターンで良いかと思いますよ。


    場合によっては、事前に列まで定義済みの DataTabel を用意した上で、
    「da.MissingSchemaAction」や「da.MissingMappingAction」も
    指定してから Fill するということもできますが、
    事前の列定義が必要なら型付 DataSet を使った方が手っ取り早そうです。


    > da.Fill(ds, "(テーブル名)")
    これについては、da.Fill(ds) だけでもいけると思います。
    テーブル名は自動生成されたものになりますケド。
    (da.TableMappings の事前指定が無い場合)
違反を報告
引用返信
■34057 / ResNo.6)  Re[4]: SQLServerテーブル内容をDataGridViewに表示するコードについて
□投稿者/ けい 一般人(17回)-(2018/11/30(Fri) 19:03:42)
  • アイコンNo34056に返信(魔界の仮面弁士さんの記事)

    ありがとうございます。
    とても参考になり、助かりました。

    今後ともどうぞよろしくお願い申し上げます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-6]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34042 / 親記事)  oo4oのAddTableをADOに移行したい
□投稿者/ Yoshi 一般人(1回)-(2018/11/26(Mon) 16:40:20)
  • アイコン環境/言語:[VBA] 
    分類:[ASP.NET] 


    業務で使用しているExcelでOfficeの64bitに対応するため、oo4oからADOへの変更作業を行っています。
    Excelを利用しておりVBAで書かれています。

    Oracleのバージョンは11gです。

    AddTableを使いストアドプロシージャで配列として受け渡しをしているようなのですが
    ADOで渡すための方法がわからず、ご教示いただきたいと思っております。

    以下にoo4oで書かれたロジックを記載いたします。
    【VBA(oo4o)】
    OraDB.Parameters.AddTable "inAnimal", ORAPARM_INPUT, ORATYPE_VARCHAR2, Arraysize, 255
    Set inAnimal = OraDB.Parameters("inAnimal")

    'カウンタループ 'l'はカウンタ
    inAnimal(l) = AnimalSet(l)
    'Loop
    ExecuteSQL ("BEGIN PROCEDURE(:inAnimal)End;)

    【PROCEDURE】
    TYPE Array IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
    PROCEDURE (inAnimal IN Array)
    IS...

    少し考えて作ったADOのソースは以下になります。(うまく配列が渡せないため落ちます。)

    Set param = cmd.CreateParameter("inAnimal", adVarChar Or adArray, adParamInput, 255, AnimalSet)

    cmd.Parameters.Append param
    cmd.CommandText = "BEGIN PROCEDURE(:inAnimal); END;"
    cmd.Execute 


    間違っている箇所や方法をご存知の方いらっしゃいましたらよろしくお願いいたします。

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34043 / ResNo.1)  Re[1]: oo4oのAddTableをADOに移行したい
□投稿者/ 魔界の仮面弁士 大御所(1170回)-(2018/11/26(Mon) 19:13:41)
  • アイコン2018/11/27(Tue) 11:15:33 編集(投稿者)

    No34042に返信(Yoshiさんの記事)
    > AddTableを使いストアドプロシージャで配列として受け渡しをしているようなのですが
    > ADOで渡すための方法がわからず、ご教示いただきたいと思っております。

    ADODB では対応していないと思います。

    ストアドを変更できるなら、配列パラメータ(Associative Array)を用いず、
    Temporary Table 経由で受け渡す作りに書き換えてみてはいかがでしょう。

    ストアドを変更できない場合は、配列渡しができるよう、
    32bit 版プロセスな VBScript 経由で OO4O を呼び出すか、
    もしくは、ODP.NET 経由で呼び出すようなラッパーライブラリを
    作ることを検討してみるとか。


    > Set param = cmd.CreateParameter("inAnimal", adVarChar Or adArray, adParamInput, 255, AnimalSet)

    Set p = cmd.CreateParameter("inAnimal", 型, adParamInput)
    cmd.Parameters.Append p
    Let p.Value = 値
    cmd.Execute

    の構文で実験してみました。


    (1) 「adVarChar Or adVarArray」「adBSTR Or adArray」
    → cmd.Parameters.Append の時点で ADO エラー: adErrInvalidParamInfo
     
    (2) 「adVariant Or adVarArray」「adVariant」
    → Variant()、Variant を受け付けたが、Execute 時に実行時例外(E_FAIL)を起こす。Err.Description は毎回変化するゴミ文字列なので、ポインタが破壊されている可能性あり。
     
    (3) adIUnknown
    → 渡すべきインターフェイスがわからないのですが、
     少なくとも下記のコードでは、内部エラーでクラッシュしました。
     
    'Dim rec As ADODB.Recordset
    'Set rec = New ADODB.Recordset
    'rec.Fields.Append "F1", adVarChar, 2000, adFldIsNullable
    'rec.Open
    'rec.AddNew Array("F1"), Array("いぬ")
    'rec.AddNew Array("F1"), Array("ねこ")
    'rec.AddNew Array("F1"), Array("かめ")
    'rec.UpdateBatch

    'Dim rec As Scripting.Dictionary
    'rec dic = New Scripting.Dictionary
    'rec(12) = "いち"
    'rec(34) = "に"
    'rec(56) = "さん"

    'Dim rec As VBA.Collection
    'Set rec = New VBA.Collection
    'rec.Add "いち", "12"
    'rec.Add "に", "34"
    'rec.Add "さん", "56"

    'Set p.Value = rec 'VBA エラー: 424 オブジェクトが必要です
    'Let p.Value = rec 'ADO エラー: adErrInvalidArgument
    Dim uk As stdole.IUnknown
    Set uk = rec
    'Set p.Value = uk 'VBA エラー: 424 オブジェクトが必要です
    Let p.Value = uk 'ここまでは実行できた
    cmd.Execute 'ここでクラッシュ
違反を報告
引用返信
■34045 / ResNo.2)  Re[2]: oo4oのAddTableをADOに移行したい
□投稿者/ 魔界の仮面弁士 大御所(1172回)-(2018/11/27(Tue) 11:19:43)
  • アイコン
    No34043に追記(魔界の仮面弁士の記事)
    > 実験してみました。 
    
    参考までに、当方が実験で用いたパッケージを示しておきます。
    
    --CREATE TABLE TEST_TABLE (COL1 VARCHAR2(2000), COL2 NUMBER );
    --/
    CREATE OR REPLACE PACKAGE PKG_SAMPLE
    AS
        TYPE TestArray IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
        PROCEDURE EXAMPLE(inAnimal IN TestArray);
    END PKG_SAMPLE;
    /
    CREATE OR REPLACE PACKAGE BODY PKG_SAMPLE AS
        PROCEDURE EXAMPLE(inAnimal IN TestArray) IS
           IDX BINARY_INTEGER;
           VAL VARCHAR2(2000);
        BEGIN
           IDX := inAnimal.FIRST;
           FOR N IN 1..inAnimal.COUNT LOOP
              VAL := inAnimal(IDX);
              INSERT INTO TEST_TABLE (COL1, COL2) VALUES ( VAL, IDX );
              IDX := inAnimal.NEXT(IDX);
           END LOOP;
        END EXAMPLE;
    END PKG_SAMPLE;
    /
    /* ADO 側
      Dim cmd As ADODB.Command
      Set cmd = New ADODB.Command
      Set cmd.ActiveConnection = cn
      cmd.CommandText = "PKG_SAMPLE.EXAMPLE"
      cmd.CommandType = adCmdStoredProc
    */
    
    
    > Set p = cmd.CreateParameter("inAnimal", 型, adParamInput)
    
    ここの『型』を調べるために、OLE DB でスキーマを取得してみました。
    
    'https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms713623(v%3dvs.85)
    Dim rs1 As ADODB.Recordset
    // 下記は "SELECT * FROM USER_ARGUMENTS" に相当
    Set rs1 = cn.OpenSchema(adSchemaProcedureParameters)
    
    
    OraOLEDB.Oracle の場合は 1 件のみ返却され、
    MSDAORA で取得した場合は 2 件となっていましたが、
    いずれも、、パラメータの型として adIUnknown が得られましたので、
    値として要求されているのは、いわゆる配列(SAFEARRAY) ではなく、
    何らかの配列オブジェクト(COM インターフェイス)が要求されるようです。
    
    以下に結果を記します。
    (Recordset の列数が多いので、行列変換して縦に並べています)
    
    ==========================================================================
    【OraOLEDB.Oracle の場合】… 1 件が該当
    (1/1) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: "INANIMAL"
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: (null)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 13 (adIUnknown)
    Character_Maximum_Length: (null)
      Character_Octet_Length: (null)
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "PL/SQL TABLE"
             Local_Type_Name: "PL/SQL TABLE"
                    Overload: (null)
    ==========================================================================
    【MSDAORA の場合】… 何故か 2 件が該当
    (1/2) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: "INANIMAL"
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: 0 (VARIANT_FALSE)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 13 (adIUnknown)
    Character_Maximum_Length: (null)
      Character_Octet_Length: (null)
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "PL/SQL TABLE"
             Local_Type_Name: (null)
                    Overload: (null)
    (2/2) --------------------------------------------------------------------
           Procedure_Catalog: (null)
            Procedure_Schema: スキーマ名
              Procedure_Name: "PKG_SAMPLE.EXAMPLE"
              Parameter_Name: (null)
            Ordinal_Position: 1
              Parameter_Type: 1 (adParamInput)
        Parameter_HasDefault: 0 (VARIANT_FALSE)
           Parameter_Default: (null)
                 Is_Nullable: -1 (VARIANT_TRUE)
                    DataType: 129 (adChar)
    Character_Maximum_Length: 2000
      Character_Octet_Length: 2000
           Numeric_Precision: (null)
               Numeric_Scale: (null)
                 Description: (null)
                   Type_Name: "VARCHAR2"
             Local_Type_Name: (null)
                    Overload: (null)
    ==========================================================================

違反を報告
引用返信
■34046 / ResNo.3)  Re[2]: oo4oのAddTableをADOに移行したい
□投稿者/ Yoshi 一般人(2回)-(2018/11/27(Tue) 16:17:25)
  • アイコン魔界の仮面弁士様
    いろいろとお調べいただきありがとうございます。
    配列で渡すのはできなさそうなんですね。。。

    > ストアドを変更できない場合は、配列渡しができるよう、
    > 32bit 版プロセスな VBScript 経由で OO4O を呼び出すか、
    > もしくは、ODP.NET 経由で呼び出すようなラッパーライブラリを
    > 作ることを検討してみるとか。

    oo4oの配列渡しを使っているプロシージャが5本あり、処理も複雑であり
    ストアドを変更する(変数受け取りなどに変える)と、ほぼ新規に5本
    立ち上げる必要があるためなるべく変更せずに現行処理を使いたいと考えています。

    そうした状況の場合、
    Windows10 64bit
    Excel 64bit で考えると
    どの手法が現実的でしょうか。
    (どういった改修が工数が小さいでしょうか)

    エンジニアとして知識が浅く、稚拙な文章になってしまい申し訳ありません。
    主観で結構ですのでご教示お願いできませんでしょうか。




違反を報告
引用返信
■34047 / ResNo.4)  Re[3]: oo4oのAddTableをADOに移行したい
□投稿者/ 魔界の仮面弁士 大御所(1173回)-(2018/11/27(Tue) 16:52:54)
  • アイコン2018/11/27(Tue) 16:58:09 編集(投稿者)

    No34046に返信(Yoshiさんの記事)
    > ストアドを変更する(変数受け取りなどに変える)と、ほぼ新規に5本

    元のストアドは、必ずしも変更しなくて良いのではないでしょうか。


    VBA 側は、配列オブジェクトとして渡していた部分を、
    作業用テーブルへの AddNew (INSERT 処理)に変更します。

    Oracle 側には、その作業テーブルから、データを配列にして
    元のストアドを呼び出すようなストアドを追加する、という流れ。


    この場合、中継用のストアドが増えるだけで、
    元のストアドはそのまま生かせるんじゃないかと…。


    > Windows10 64bit
    > Excel 64bit で考えると
    > どの手法が現実的でしょうか。

    64bit 版 VBA だと、COM(ActiveX) コンポーネントも 64bit 版が要求されますが、
    ・ADODB + OLEDB は配列オブジェクトを渡せない
    ・ODBC でも渡せない
    ・OO4O は 32bit 版しかない
    と言うことで、64bit 版 VBA だと、正直どうしようも無いと思います。
    VBA ではなく、.NET (あるいは Java とか?)なら対処できそうですが。


    > (どういった改修が工数が小さいでしょうか)

    既定では、64bit OS 上であっても、32bit 版の Office が導入されますよね。
    https://support.office.com/ja-jp/article/2dee7807-8f95-4d0c-b5fe-6c6f49b8d261

    64bit 版で無ければならない強い理由付けが無い限りは、
    Office 64bit をアンインストールして、
    32bit 版 Office と 32bit 版 Oracle Client を入れなおすのも選択肢の一つです。
    そうすれば oo4o を引き続き利用できるので、追加の開発工数が不要になります。

    ただ、64bit 版前提の VBA コードを既に組んでしまっているとなると、
    後掛り作業になってしまうでしょう。


    もし、Office は 64bit のままにしておきたいのであれば、
    配列オブジェクトを渡すために、
     ・「32bit VBScript + OO4O」を Excel VBA から Shell 関数等で呼び出す
     ・「.NET Framework + ODP.NET」を Excel VBA から Shell 関数等で呼び出す
    などの手直しが必要になるかと思います。


    ところで、今回の場合、INDEX BY BINARY_INTEGER が付与されているので、
    結合配列(索引付き表)を使っているのですよね。だとしたら、
    > 'カウンタループ 'l'はカウンタ
    > inAnimal(l) = AnimalSet(l)
    > 'Loop
    というのは、少々不自然な印象を受けました。

    索引付きの場合は連番ではなく、いわゆる Key Value Pair な
    連想配列になるはずで、そうすると VBA 側としては、
    Dictionary などでコレクション管理されているはずでは…?


    なお、先の No34045 のパッケージであれば、

    DECLARE
    inanimal スキーマ名.PKG_SAMPLE.TestArray;
    BEGIN
    inanimal(12) := 'いち';
    inanimal(34) := 'に';
    inanimal(56) := 'さん';
    PKG_SAMPLE.EXAMPLE( inanimal );
    inanimal.DELETE;
    END;

    という動的 SQL 文を作って「cn.Execute SQL」することはできます。

    インジェクション対策や SQL コマンドの長さ制限等を考えると、
    あまり積極的にお奨めできる方法では無いですが…。
違反を報告
引用返信
■34055 / ResNo.5)  Re[4]: oo4oのAddTableをADOに移行したい
□投稿者/ Yoshi 一般人(4回)-(2018/11/30(Fri) 17:12:14)
  • アイコン返信が遅くなり申し訳ありません。
    下記2点のことから方針が決まりました。

    > 64bit 版 VBA だと、COM(ActiveX) コンポーネントも 64bit 版が要求されますが、
    > ・ADODB + OLEDB は配列オブジェクトを渡せない
    > ・ODBC でも渡せない
    > ・OO4O は 32bit 版しかない
    > と言うことで、64bit 版 VBA だと、正直どうしようも無いと思います。

    > 32bit 版 Office と 32bit 版 Oracle Client を入れなおすのも選択肢の一つです。
    > そうすれば oo4o を引き続き利用できるので、追加の開発工数が不要になります。

    32bit 版 Office と 32bit 版 Oracle Client を使うことで回避できるのであれば
    おおきな工数をかけてまでする作業ではないとのことです。
    このことから本件については解決になりました。

    このたびはお世話になりました。
    大変助かりました。ありがとうございます。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▲上のスレッド
■34034 / 親記事)  データバインド時のDataGridViewのカスタムソート
□投稿者/ ミンミン 一般人(1回)-(2018/11/15(Thu) 14:02:24)
  • アイコン環境/言語:[VB2013] 
    分類:[.NET] 

    DataGridViewのカスタマイズソートについて、以下には
    IComparerインターフェイスを使用する方法が紹介されています。

    DataGridViewの行の並び替えの方法を変更する
    〜DataGridView.Sortメソッドを使用する方法〜
    https://dobon.net/vb/dotnet/datagridview/customsort.html#section2

    この方法だと、かなり特殊なソート方法を定義できるので便利なのですが、
    「DataGridViewのDataSourceプロパティが設定されておらず...」
    という注釈があります。

    これは、DataGridViewにデータバインドしている場合には
    IComparerインターフェイスの方法が使用できない、と理解したのですが、
    データバインドを行った場合でも、IComparerインターフェイスのように
    かなり自由にソート方法を定義する方法はないでしょうか?
    バインドしたデータにソート値用の列を設けることも考えたのですが、
    新しい項目をバインド元データに用意するのもどうかと思い、
    質問した次第です。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34035 / ResNo.1)  Re[1]: データバインド時のDataGridViewのカスタムソート
□投稿者/ 魔界の仮面弁士 大御所(1168回)-(2018/11/16(Fri) 12:03:48)
  • アイコン
    No34034に返信(ミンミンさんの記事)
    > データバインドを行った場合でも、IComparerインターフェイスのように
    > かなり自由にソート方法を定義する方法はないでしょうか?
    
    手抜き実装だとこんな感じ。
    
    Imports System.ComponentModel
    
    Public Class Form1
        Private list As New SortableBindingList(Of Record)()
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            list.Add(New Record(4, "あああ"))
            list.Add(New Record(1, "いいい"))
            list.Add(New Record(999, "これを先頭にする"))
            list.Add(New Record(3, "ううう"))
            list.Add(New Record(5, "えええ"))
            list.Add(New Record(2, "あああ"))
            DataGridView1.DataSource = list
        End Sub
    End Class
    
    Public Class Record
        Implements IComparable, IComparable(Of Record)
        Public Property Id As Integer
        Public Property Name As String
        Public Sub New(id As Integer, name As String)
            Me.Id = id
            Me.Name = name
        End Sub
    
        Public Function CompareTo(other As Record) As Integer Implements IComparable(Of Record).CompareTo
            '★ここが独自の比較処理★
            If Id = 999 Then
                Return -1
            ElseIf other.Id = 999 Then
                Return 1
            Else
                Return Id.CompareTo(other.Id)
            End If
        End Function
    
        Private Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo
            Return Me.CompareTo(DirectCast(obj, Record))
        End Function
    End Class
    
    Public Class SortableBindingList(Of T)
        Inherits BindingList(Of T)
        Protected Overrides ReadOnly Property SupportsSortingCore As Boolean
            Get
                Return True
            End Get
        End Property
        Protected Overrides Sub ApplySortCore(prop As PropertyDescriptor, direction As ListSortDirection)
            Dim list = TryCast(Items, List(Of T))
            If list Is Nothing Then
                Return
            End If
            list.Sort()
            OnListChanged(New ListChangedEventArgs(ListChangedType.Reset, -1))
        End Sub
    End Class
    
    
    上記は、レコード側に IComparable を付けただけなので、
    昇順/降順の切り替えや、別の列をソートするなどの対応が出来ません。
    
    降順などにも対応させたい場合には、ApplySortCore の引数もチェックします。
    また、その場合はレコード側に IComparable を実装するのではなく、
    IComparer(Of T) を実装したカスタムソート用のクラスを用意して、
    『list.Sort()』の代わりに『list.Sort( IComparer(Of T) )』を呼びだします。
    
    参考リンク
    https://garafu.blogspot.com/2016/09/cs-sorablebindinglist.html

違反を報告
引用返信
■34041 / ResNo.2)  Re[2]: データバインド時のDataGridViewのカスタムソート
□投稿者/ ミンミン 一般人(2回)-(2018/11/26(Mon) 15:03:36)
  • アイコン魔界の仮面弁士 さん、ありがとうございました。
    色々と試してみます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]






Mode/  Pass/


- Child Tree -

2018/12/20(Thu) 00:38:56 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする