【问题标题】:How do I create a dataset in VB.NET from this code?如何从此代码在 VB.NET 中创建数据集?
【发布时间】:2017-05-15 22:58:44
【问题描述】:

我的项目中目前有以下代码,它使用 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?

提前感谢您的帮助。

【问题讨论】:

  • 创建和填充数据集而不是数据表。您不需要 DataSet 来获取行数 - 它们大多只是一个表集合。如果您想在其他地方使用它,您可能想要制作一个表单级别的对象 - 但如果您没有丢弃它,您可以对您的表格做同样的事情
  • MaxRows = ds.Tables("Dataset_Users").Rows.Count 请注意,DataSet 不包含任何数据。它包含 1 个或多个表:注意代码如何钻入集合以作用于特定表。您也可以在创建表时得到它:MaxRows = Adapter.Fill(Table)
  • PerformQuery() 方法存在严重缺陷,因为它迫使您编写极易受到 SQL 注入攻击的代码。除了查询文本之外,您还需要向该方法添加一个附加参数以接受查询数据,然后进一步更新该方法以使用该数据创建参数化查询。

标签: vb.net dataset oledb


【解决方案1】:

我认为你在以下:

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

【讨论】:

    【解决方案2】:

    以更实用的方式思考。 返回表格而不是设置为网格。当我们在这里时,让我们更新方法,这样您就不必再编写让您对 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
    

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多