0

重複の可能性:
SQL結果をDataGridViewに表示する際の問題

私は以前にこの質問をしたことがありますが、分類されたことはありません。基本的に、SQLクエリの結果をフォームのdatagridviewに入力しようとしています。このコードからエラーは発生しませんが、完全に空白のdatagridviewが表示されます。つまり、列見出しすら表示されません。

また、現在SQLインジェクションを開いていることを知っていることに注意してください。ソートする前にこれを機能させたいだけです。

これが私のクラスコード全体です:

Imports System.Data.OleDb
Imports System.Data

Public class TechScreen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0: Data Source = C:\Users\Dave\Documents\jobList.mdb;")
Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM jobList WHERE techID = " &  TechScreenID &"", con)
con.Open()
Dim DA As OleDbDataAdapter = New OleDbDataAdapter(cmd)
Dim mydataset As DataSet = New DataSet
DA.Fill(mydataset, "MyTable")
DataGridView1.DatSource = mydataset.Tables("MyTable").DefaultView
con.Close()
con = Nothing

End sub
End class
4

1 に答える 1

0

まず、問題の原因である場合とそうでない場合がありますが、次の行です。

DataGridView1.DatSource = mydataset.Tables("MyTable").DefaultView

タイプミスが含まれています。DataGridView1.DataSource である必要があります。ただし、これによりコンパイラエラーが発生したようです。

それ以外は、以下のような単純化を試みてください。まだバインドの問題がある場合は、デバッガーでステップスルーして、すべてが期待どおりに機能していることを確認してください。また、dgv コントロールの「列の自動生成」プロパティが true に設定されていることを確認してください。

あなたがやろうとしていることのいくつかについては明確ではないので、以下は私がこれにどのようにアプローチするかの非常に一般的な例です.

  • まず、接続文字列をプロジェクト設定ファイルに移動し、My.Settings.MyConnectionStringName を使用して参照します。
  • 次に、インライン連結ではなく、SQL でパラメーターを使用します。
  • 「Using」ブロックでデータ アクセスをラップします。を使用すると、ブロック スコープ内のオブジェクトの破棄が処理され、一般にクリーンな方法になります。
  • 私の個人的な好みですが、単純なデータテーブルが行うデータセットに伴うすべての bs オーバーヘッドは好きではありません。
  • ここではできる限り完全には実行しませんでしたが、データの取得を UI コントロールへの割り当てから分離することをお勧めします。さらに、おそらく次のステップに進み、コントロールの割り当てを Form Load イベントからも分離します。フォーム内に、データソースの更新またはリセットが必要な場所が複数あることに気付くかもしれません。

これにアプローチするにはさまざまな方法があり、私の方法は必ずしも「一般的な方法」ではありません。ただし、次の方法でうまくいきました。

コードを簡素化し、いくつかのリファクタリングを採用します。

Imports System.Data
Imports System.Data.OleDb

Public Class TechScreen

    Private Sub TechScreen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'Not sure where your TechScreenID input parameter is coming from, so this is just for example:
        Dim TechID As Integer = 1

        ' Use a function to return the data to be used as the DataSource for the dgv control:
        DataGridView1.DataSource = Me.JobListTable(TechID)

    End Sub


    Private Function JobListTable(TechID As Integer) As DataTable
        Dim dt As DataTable = Nothing

        Dim SQL As String = "SELECT * FROM joblist WHERE techID = @TechID"

        ' The Using block handles disposal of objects initialized:
        Using con As OleDbConnection = New OleDbConnection(My.Settings.MyConnection)
            Using cmd As OleDbCommand = New OleDbCommand(SQL, con)

                ' Use parameters instead of inline concatenation for cleaner code,
                ' and protection against sql injection attacks:
                cmd.Parameters.AddWithValue("@TechID", TechID)
                con.Open()

                dt = New DataTable()

                Try
                    dt.Load(cmd.ExecuteReader())
                Catch
                    MsgBox("There was an error retrieving data")
                Finally
                    con.Close()
                End Try
            End Using
        End Using

        Return dt

    End Function

End Class
于 2012-10-27T16:24:46.963 に答える