我目前在我的项目中有以下代码,它使用SQL查询的结果填充DataGridView对象。
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
在我的项目的其他地方,我可以使用代码
创建一个DataSet
对象
Dim ds As New DataSet
然后使用以下代码从中提取数据:
MaxRows = ds.Tables("Dataset_Users").Rows.Count
我如何使用PerformQuery
代码创建数据集,而不是填充DataGridView?
提前感谢您的帮助。
答案 0 :(得分: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
或者在您的示例中,您在数据集中的行数之后可以使用DataTable执行相同的操作,例如:
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
答案 1 :(得分: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