2017-01-01 12 views
0

現在、私のプロジェクトには、SQLクエリの結果をDataGridViewオブジェクトに取り込む次のコードがあります。他の場所で私のプロジェクトでこのコードからVB.NETでデータセットを作成するにはどうすればよいですか?

Sub PerformQuery(ByVal SQLText As String) 
    Dim DbConnection As New OleDb.OleDbConnection(createConnectionString) 

    Dim SQLQuery As String = SQLText 

    Dim Adapter As New OleDb.OleDbDataAdapter(SQLQuery, DbConnection) 

    Try 
     Using Table As New DataTable 
      Adapter.Fill(Table) 
      Table.Locale = Globalization.CultureInfo.InvariantCulture 
      DbConnection.Close() 
      DataGridView1.DataSource = Table 
     End Using 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

私はコード

Dim ds As New DataSet 

を使用してDataSetオブジェクトを作成し、次のようなコードを使用して、そこからデータを抽出することができます。

MaxRows = ds.Tables("Dataset_Users").Rows.Count 

よりもむしろDataGridViewのを移入、 PerformQueryコードを使用してデータセットを作成するにはどうすればよいですか?

ご協力いただきありがとうございます。

+0

今、あなたは、このような更新メソッドを呼び出します。行数を取得するには、DataSetは必要ありません。ほとんどの場合、テーブルコレクションです。あなたはおそらくフォームレベルのオブジェクトを作成したいと思うかもしれませんが、それ以外の場所で使用したいのですが、もしあなたがそれを二重にしなかったなら、あなたのテーブルで何かをすることができます – Plutonix

+0

'MaxRows = ds.Tables(" Dataset_Users ")。Rows.Count'データセットにはデータが保持されないことに注意してください。 1つ以上のテーブルを保持しています。特定のテーブルで動作するようにコレクションにコードをドリルする方法に注目してください。 'MaxRows = Adapter.Fill(Table)' – Plutonix

+0

'PerformQuery()'メソッドは深刻な欠陥があります。SQLインジェクション攻撃に脆弱なコードを書き込まなければならないからです。メソッドに追加のパラメーターを追加して、照会テキストに加えて照会データを受け取り、そのデータを使用してパラメーター化された照会を作成するメソッドをさらに更新する必要があります。 –

答えて

0

私はあなたが以下の後にあると思う:

Try 
    Dim ds As New DataSet 
    Using Table As New DataTable 
     Adapter.Fill(Table) 
     Table.Locale = Globalization.CultureInfo.InvariantCulture 
     DbConnection.Close() 
     DataGridView1.DataSource = Table 
     ds.Table.Add(Table) 
    End Using 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 

それともあなたは、たとえば、データテーブルで同じことを行うことができ、データセット内の行数の後だったあなたの例のように:

Try 
    Dim MaxRows As Integer 
    Using Table As New DataTable 
     Adapter.Fill(Table) 
     Table.Locale = Globalization.CultureInfo.InvariantCulture 
     DbConnection.Close() 
     DataGridView1.DataSource = Table 

     '' Getting the number of rows in the DataTable 
     MaxRows = Table.Rows.Count 
    End Using 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 
0

もっと機能的なスタイルで考えてみましょう。 グリッドに設定する代わりにテーブルを返します。私たちがここにいる間、あなたは、SQLインジェクション攻撃に対して大きく開いあなたを残しているもうクエリを記述する必要はありませんので、のは、メソッドを更新しましょう:私はまた、エラー処理とロケールコードを削除

Function PerformQuery(ByVal SQLText As String, ByVal ParamArray Parameters() As OleDbParameter) As DataTable 
    Dim result As New DataTable() 

    Using cn As New OleDb.OleDbConnection(createConnectionString), _ 
      cmd As New OleDb.OleDbCommand(SQLText, cn), _ 
      Adapter As New OleDb.OleDbDataAdapter(cmd, cn) 

     If Parameters IsNot Nothing AndAlso Parameters.Length > 0 Then 
      cmd.Parameters.AddRange(Parameters) 
     End If 
     Adapter.Fill(result) 
    End Using 

    Return Result 
End Function 

注意。それでもやる必要はありますが、メソッドのユーザーインターフェイスと直接やりとりするのではなく、単にデータテーブルを返すだけで、コードをより抽象度の低いレベルに効果的に移動できます。そうすると、おそらくこの下位レベルのエラー処理に対処する必要はありません。代わりにユーザーインターフェイスの近くで例外を扱うことができる例外をバブルアップさせます。代わりに、データテーブルのデータセットを作成し、記入

Dim sql As String = "SELECT * FROM Customers WHERE CustomerID = ?" 
Dim CustID As New OleDb.OleDbParameter("CustomerId", OleDbType.Integer) 
CustID.Value = 123456 

Try 
    DataGridView1.DataSource = PerformQuery(sql, CustID) 
Catch Ex As Excpetion 
    MsgBox(Ex.Message) 
End Try 
関連する問題