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

[ 最新記事及び返信フォームをトピックトップへ ]

■34049 / inTopicNo.1)  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
マルチポストを報告
違反を報告
引用返信 削除キー/
■34051 / inTopicNo.2)  Re[1]: SQLServerテーブル内容をDataGridViewに表示するコードについて
□投稿者/ 魔界の仮面弁士 大御所(1175回)-(2018/11/30(Fri) 11:40:57)
  • アイコン
    No34049に返信(けいさんの記事)
    > Aはエラーになりますが、
    
    それは…当然そうなるでしょうね。
    
    Fill メソッドの引数が ByRef で無いことからも推察できますが、
    何某DataAdapter.Fill(DataTable) メソッドの引数に
    Nothing を渡すことはできない仕様、ということでしょう。
    
    
    DataAdapter.Fill は、DataTable という器にデータを詰め込ませる操作です。
    謂わば、空のカップを差し出して「ここに珈琲を注いでください」と依頼するイメージ。
    
    カップを渡さずに「ここに珈琲を注いでください」と依頼したところで、
    相手からは『どこに?』と言う返事が返されてしまうことでしょう。
    
    仮に、珈琲を注ぐための新しい紙カップも相手が用意してくれる仕様なら、
    その器となる DataTable は出力引数(ByRef) となっているか、もしくは
    メソッドの戻り値(Sub ではなく Function)となるよう設計されていたはず。
    
    
    > どのパターンを使用しても問題ないでしょうか。
    見た感じ、Using している様子も無いですし
    SqlConnection を閉じ忘れていたりはしませんか?
    
    
    で。運用上は B〜D のいずれでも良いですし、
    簡易的なものであれば B で済ませることもありますが、
    個人的には DataSet 付の C〜D がお奨めです。
    必要に応じて EnforceConstraints のオン/オフなどもできるので。
    
    
    また、DataSet 付きの場合には、
    > DataGridView1.DataSource = dt
    というバインド方法のほかに、
     DataGridView1.DataSource = ds
     DataGridView1.DataMember = dt.TableName
    ということもできます。
    
    さらに言えば、BindingSource を併用するとベターかと。
    
    
    
    > VB2015、Windows10、.NETFramework4.6で開発しています。
    
    .NET Framework 4.6 を搭載している Windows 10 は、
    初期版(RTM)の v1507 だけではありませんか?
    
    v1507 は既にサポート ライフサイクルが終了しているはずですが…。
    v1703 以降の Win10 には .NET Framework 4.6.x をインストールできません。
    
    
    .NET Framework 4.x バージョンは、インプレース更新であるため、
    PC 上にインストールできるバージョンは 1 つだけとなっています。
    
    Pro と Enterprise/Education などといったエディションの違いによる
    サービス終了日の違い(LTSB / LTSC 版など)や
    サービスチャネルによる公開日の差異はありますが、一般的な環境では
    Win10 のバージョンが v1709 (Fall Creators Update) 以降になっているはずで、
    この場合、インストール可能な .NET Framework は 4.7.1 以降となります。
    (ただし .NET Framework 3.5 SP1 は併存可能)
    
    
    以下、当方の認識している分を表にまとめてみました。
    
    Win10  リリース日  サポート期限  利用可能な .NET Framework 4.x バージョン
    v1809  2018/11/13  ○2020/05/12  4.7.2
    v1803  2018/04/30  ○2019/11/12  4.7.2
    v1709  2017/10/17  ○2019/04/09  4.7.1 / 4.7.2
    v1703  2017/04/05  ×2018/10/09  4.7 / 4.7.1 / 4.7.2
    v1607  2016/08/02  ×2018/04/10  4.6.2 / 4.7 / 4.7.1 / 4.7.2
    v1511  2015/11/12  ×2017/10/10  4.6.1 / 4.6.2
    v1507  2015/07/29  ×2017/05/09  4.6 / 4.6.1 / 4.6.2

違反を報告
引用返信 削除キー/
■34052 / inTopicNo.3)  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 / inTopicNo.4)  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 / inTopicNo.5)  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 / inTopicNo.6)  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 / inTopicNo.7)  Re[4]: SQLServerテーブル内容をDataGridViewに表示するコードについて
□投稿者/ けい 一般人(17回)-(2018/11/30(Fri) 19:03:42)
  • アイコンNo34056に返信(魔界の仮面弁士さんの記事)

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

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



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -