none
DataGridにテーブルを表示させたい RRS feed

  • 質問

  • こんにちは!

    1.開発言語: VB.NET  2003 (Windowsフォーム)

    2.DB:Access  (DB名:テスト  テーブル名:社員マスタ )

    3.やりたいこと:

              DataGridに社員マスタテーブルを表示させたい

    4.コーディング:

     Private Sub frmマスタ_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data Source=C:\VB.NET\引合システム\テスト.mdb;") '接続するファイル名
            cn.Open()

            Dim cmd As New OleDbCommand("SELECT * FROM 社員マスタ", cn)
            Dim dr As OleDbDataReader = cmd.ExecuteReader()
            -----------------------------------------------------------------------------
            Me.DataGrid1.DataSource = dr    ←今現在ここで引っかかる

            -----------------------------------------------------------------------------
        End Sub     

     

     

    今現在 データベースには接続されてるのですが、

    DataGridへのデータをセットする方法がわかりません!

     

    ご教授 よろしくお願いします!    

      

    2007年9月28日 5:59

すべての返信

  • OleDbDataAdapterとDataTbleを使ってください。

    あと明示的にDisposeするのがよいかと。

    2007年9月28日 7:12
  • はなはなはなさん:

     

    コメント、ありがとうございました。

     

    OleDbDataAdapterとDataTbleをしようするとできるということは 知ってましたが、

    上司からOleDbDataAdapterを使うのを禁止されたので、

    OleDbDataReaderを使う方法を検討したのですが、できませんでした。

     

     

    2007年10月2日 1:52
  • とりこびとです。

     

     ケーティ さんからの引用

     

    OleDbDataAdapterとDataTbleをしようするとできるということは 知ってましたが、

    上司からOleDbDataAdapterを使うのを禁止されたので、

    OleDbDataReaderを使う方法を検討したのですが、できませんでした。

     

     

    であれば、

     

    OleDbDataReader + DataTable

     

    の組み合わせではいかがでしょうか?

    2007年10月2日 4:46
  •  ケーティ さんからの引用

    OleDbDataAdapterとDataTbleをしようするとできるということは 知ってましたが、

    上司からOleDbDataAdapterを使うのを禁止されたので、

    OleDbDataReaderを使う方法を検討したのですが、できませんでした。

     

    禁止される理由が本気でわからないのですね。
    私は SELECT したい時は DataAdapter を使うのが多くの場合最も賢明だと思っております。

    2007年10月2日 12:11
  •  ケーティ さんからの引用

    OleDbDataReaderを使う方法を検討したのですが、できませんでした。

     

    OleDbDataReaderはDataGridのDataSourceに直接指定することはできません。指定でいるものは以下のページに載っています。

     

    DataGrid.DataSource プロパティ

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.datagrid.datasource(VS.80).aspx

     

    #ASP.NETのDataGridでは、DataSourceにOleDbDataReaderを指定できますので、そちらと混乱されたのかもしれません。

    2007年10月2日 14:28
    モデレータ
  • こんにちは!ケーティです。

    皆さんのアドバイスと合わせて、以下の方法を試しました。

     とりこびと さんからの引用

     

    OleDbDataReader + DataTable

     

    の組み合わせではいかがでしょうか?

     

    OleDbDataReader + DataTable の組合せを試しました。

    コーディングはこのようにしています。

     ケーティ さんからの引用

            Dim St As String
            Dim oleCn As System.Data.OleDb.OleDbConnection = New OleDb.OleDbConnection
            Dim oleCmd As OleDb.OleDbCommand
            Dim dtRder As OleDb.OleDbDataReader
            Dim dtTbl As DataTable

           

           '接続文字列を作成する
            oleCn.ConnectionString = _
                     "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                     "Data Source=C:.......Test.mdb;" & _
                     "Persist Security Info = False"

            oleCn.Open()

            oleCmd = oleCn.CreateCommand()
            oleCmd.CommandText = "SELECT * FROM 引合案件"

          

            'DataRederのインスタンスを作成
            dtRder = oleCmd.ExecuteReader()

     

         'DataReaderより テーブルを取得する    ←ここがよくわからなくて 困っています。

        dtTable = dtRder.?????

     

        '取得したテーブルをDataGridにセットする

        me.DataGrid.DataSouce = 取得したデータテーブル      ←?

     

     

     

    2007年10月3日 4:47
  • まず方向性として、じゃんぬさんが言われるようにDataAdapterを使うのが正しいのですが、なぜDataAdapterを使用できないのかもう一度検討されてみられたらいかがでしょうか?

     

    さて、DataRearderを使ってDataTableを作成する方法ですが、以下のようになります。

     

    1.GetSchemaTableメソッドを使って、DataTableを作成する。

    2.作成したDataTableにDataReaderで一件ずつ読みながら保存していく。

     

    1は必須ではありません。読み込むテーブルのスキーマがわかっていれば、その通りにDataTableを作ってもかまいません。

     

    くどいですが、DataAdapterを使えば上記のことは自動で行ってくれます。

    2007年10月3日 6:01
    モデレータ
  •  trapemiya さんからの引用

    まず方向性として、じゃんぬさんが言われるようにDataAdapterを使うのが正しいのですが、なぜDataAdapterを使用できないのかもう一度検討されてみられたらいかがでしょうか?

     

    さて、DataRearderを使ってDataTableを作成する方法ですが、以下のようになります。

     

    1.GetSchemaTableメソッドを使って、DataTableを作成する。

    2.作成したDataTableにDataReaderで一件ずつ読みながら保存していく。

     

    1は必須ではありません。読み込むテーブルのスキーマがわかっていれば、その通りにDataTableを作ってもかまいません。

     

    くどいですが、DataAdapterを使えば上記のことは自動で行ってくれます。

     

    使用禁止にした理由なんですが、

     

    A.....DataAdapterとDataSetの組合せの場合の流れ(キーワードのみ)

    1.検索 → 2.DataAdapter → 3.Dataset   → 4.DataGridにセット

     

    B.....DataReaderとDataTableの組合せの場合の流れ(キーワードのみ)

    1.検索  → 2.DataReader  → 3.Datatable  → 4.DataGridにセット

     

    Bの方法ならば 2.DataReader から 3.Datatable  を生成する過程で、2つのフィールドをつなげて 1つのフィールドを作る

    などの仮想テーブルを作成することができるから Bの方法を進めているそうです。

     

     trapemiya さんからの引用

     

    1.GetSchemaTableメソッドを使って、DataTableを作成する。

    2.作成したDataTableにDataReaderで一件ずつ読みながら保存していく。

     

    というのは、このようなことなんでしょうか?

     

    1.GetSchemaTableメソッドを使って、DataTableを作成する。

      dtTbl = dtRder.GetSchemaTable

     

    2.作成したDataTableにDataReaderで一件ずつ読みながら保存していく。

      While dtRder.Read
                For i = 0 To dtRder.GetSchemaTable.Rows.Count - 1
                    For j = 0 To dtRder.GetSchemaTable.Columns.Count - 1
                                                   ←どうやってDataTableに保存していくのかが分からない。
                    Next
                Next
            End While

    2007年10月3日 7:38
  •  

    DataAdapterとDataSetでは 検証済みで、DataReaderとDataTableでも表示できると聞いたのですが、

    両者が頭のなかで 非常に混乱しているので、以下のようなものをまとめました。(※は自分の言葉で説明したつもりなんですが。)

    大変申し訳ないのですが、どなたか見ていただけませんか?

     

     trapemiya さんからの引用

    ■DataAdapterとDataSetの組合せの場合
    1.接続文字列の作成               OleCn.ConnectionString = "・・・・・"
                                                                        ※DBに接続するための暗号みたいなものと理解している
    2.データベースの接続オープン          OleCn.Open()
    3.データベースの接続               OleAdpter = New OleDb.OleDbDataAdapter("select * from 社員マスタ", OleCn)
                                            ※テーブルに接続して、その結果をOleDbDataAdapterに貯めてる
    4. データセットにDBテーブルをいれる     OleAdpter.Fill(dtSet, 社員マスタ)
                                                                             ※OleDbDataAdapterから社員マスタデータをDataSetに格納しとく
    5.データセットからテーブルを取得する     dtTable = dtSet.Tables(社員マスタ)
    6.データグリットにテーブルをセットする        Me.dgAnken.DataSource = dtTbl

     

    SOS!:4と5ところをうまく説明できません!

     

     trapemiya さんからの引用

    DAtaReaderとDataTableの組合せを使用する場合
    1.2.3 は「DataAdapterとDataSetの組合せの場合」と一緒
    4.DataReaderのインスタンスを作成        dtRder = oleCmd.ExecuteReader()
                            ※「DBに接続するコマンドを実行させて、dtRderに貯めとく」と理解している
    5.???
    6.???

     

    SOS!:5.6 はまだ解決できでません。

            5で「DataReaderからテーブルを取得する」

            6で「DataGridのDataSourceにDataTableを設定する」のではかと思いますが・・・

     

    よろしくお願いします。

    2007年10月3日 7:41
  •  ケーティ さんからの引用

    Bの方法ならば 2.DataReader から 3.Datatable  を生成する過程で、2つのフィールドをつなげて 1つのフィールドを作る

    などの仮想テーブルを作成することができるから Bの方法を進めているそうです。

     

    2つのフィールドをつなげて1つのフィールドを作るのであれば、SQL文の方で可能です。
    気持ちはわかるのですが、接続型のDataReaderで一件ずつ読みながら処理をするのはパフォーマンス的に不利です。もし、2つのフィールドをSQL文で処理できない形で1つのフィールドにするのであったとしても、一度DataAdapterでDataTableに読み込み、そのDataTableを読みながら、2つのフィールドを結合して1つのフィールドになっている新しいDataTableを作成した方がパフォーマンス的に有利であると思います。(未検証です。件数にもよるかもしれません)

     

    また、GetCchemaTableはスキーマ情報が格納されたDataTableを返すのであって、DataReaderからデータの入る予定のDataTableを作るわけではありません。
    DataTableの作成、および行の追加については以下のページの使用例を参照して下さい。

     

    DataTable.NewRow メソッド
    http://msdn2.microsoft.com/ja-jp/library/system.data.datatable.newrow(VS.80).aspx

    2007年10月3日 9:59
    モデレータ
  •  ケーティ さんからの引用

    SOS!:5.6 はまだ解決できでません。

            5で「DataReaderからテーブルを取得する」

            6で「DataGridのDataSourceにDataTableを設定する」のではかと思いますが・・・


    4はdtRderに貯めるわけではありません。DataReaderは接続型であって、DataReaderが生きている間、ずっとデータベースに接続したままになります。そこから1件ずつレコードを読んでくるイメージです。

     

    したがって、5は、自前でDataSetおよびその中にDataTableを作成しておいて、1件ずつDataReaderで読みながら、2つのフィールドを1つにして、先ほど作成したDataSetに保存していくイメージです。

     

    6はそれでOKです。

    2007年10月3日 10:00
    モデレータ
  • お返事 ありがとうございま。

     

     While dtReder.Read
                Me.DataGrid........ → このように、一件ずつ読みながら 

         一つのフィールドをデータグリットにセットしたいですが

      方法が分かりません。

      どなたか教えていただけないんでしょうか?

     End While

     

    ほかの方から ListViewのセット方法と同じやから簡単って言われたのですが、できませんでした。

    2007年10月19日 8:37
  • あれ?DataTable経由しない話になってますけど、間違いだろうと思うので

    データテーブルに読み込むコード(抜粋)を載せときます。

    列の連結とかはしていません。

           

    コード ブロック

    Dim dr As Data.OleDb.OleDbDataReader = cmd.ExecuteReader
            Dim ColumnCount As Integer = 5 '列の数
            Dim i As Integer
            Dim dt As DataTable

            Do While dr.Read '1レコード読み込み
                Dim drow As DataRow = dt.NewRow
                For i = 0 To ColumnCount - 1
                    drow.Item(i) = dr.Item(i) 'データリーダーからデータテーブルに読み込む。
                Next
                dt.Rows.Add(drow)
            Loop

     

     

    2007年10月19日 13:18