首页 > 解决方案 > 如何从 OLE DB 查询中获取数据

问题描述

请允许我证明我对 Visual Basic 和 OLE DB 编码有多么陌生。我的意图是简单地从我正在运行的查询中检索一个字段的值。下面的代码有效,但对我来说似乎很难看。我正在使用 DataAdapter 和 DataSet 来填充 DataGridView,因为这是获取信息的唯一方法。SQL 检索一行,因此我知道我想要的字段将始终位于第 0 行单元格 0 中,我可以将其移动到我的变量 strArchID 中。我猜可能有更好的方法来做到这一点(DataReader),但我不知道如何使用它。我很感激任何建议,包括示例代码。

    Try
        Dim mySQLArchID = "SELECT ArchID, ArchUserName, ArchUserDomain, ArchDate, ArchRoot FROM Archives WHERE " &
        "ArchUserName = @UserName AND " &
        "ArchUserDomain = @UserDomain AND " &
        "ArchDate = @MyArchDate AND " &
        "ArchRoot = @MyArchRoot"
        Using myConn As New OleDbConnection(strConnectionString)
            Using myGetID As New OleDbCommand(mySQLArchID, myConn)
                Dim NameParm = New OleDbParameter("UserName", OleDbType.VarChar)
                Dim DomainParm = New OleDbParameter("UserDomain", OleDbType.VarChar)
                Dim DateParm = New OleDbParameter("MyArchDate", OleDbType.Date)
                Dim RootParm = New OleDbParameter("MyArchRoot", OleDbType.VarChar)
                Dim myAdapter As New OleDbDataAdapter
                NameParm.Value = strArchUser
                DomainParm.Value = strArchDomain
                DateParm.Value = dteArchDate
                RootParm.Value = strArchRoot
                myGetID.Parameters.Add(NameParm)
                myGetID.Parameters.Add(DomainParm)
                myGetID.Parameters.Add(DateParm)
                myGetID.Parameters.Add(RootParm)
                myAdapter.SelectCommand = myGetID
                Dim ds As New DataSet
                ds.Clear()
                myAdapter.Fill(ds, "Archives")
                dgvData.DataSource = ds
                dgvData.DataMember = "Archives"
                strArchID = dgvData.Rows(0).Cells(0).Value.ToString
            End Using
        End Using

    Catch ex As Exception
        MessageBox.Show("Get Arch ID did not work")
    End Try

标签: vb.netoledb

解决方案


如果您想要数据库中的单个值,则创建一个命令对象并调用ExecuteScalar. 即使是您要保留的代码部分也可以大大简化。

Dim sql = "SELECT ArchID
           FROM Archives
           WHERE ArchUserName = @ArchUserName
           AND ArchUserDomain = @ArchUserDomain
           AND ArchDate = @ArchDate
           AND ArchRoot = @ArchRoot"

Using connection As New OleDbConnection(strConnectionString),
      command As New OleDbCommand(sql, connection)
    With command.Parameters
        .Add("@ArchUserName", OleDbType.VarChar, 50).Value = strArchUser
        .Add("@ArchUserDomain", OleDbType.VarChar, 50).Value = strArchDomain
        .Add("@ArchDate", OleDbType.Date).Value = dteArchDate
        .Add("@ArchRoot", OleDbType.VarChar, 50).Value = strArchRoot
    End With

    connection.Open()
    strArchID = CStr(command.ExecuteScalar())
End Using
  1. 最近的 VB 版本支持多行String文字,它们有助于使 SQL 代码更具可读性。即使在此之前,您仍然可以使用 XML 文字。
  2. 不要在查询中包含您实际上不需要的列。除非您有特定的理由不这样做,否则请为相应的参数使用列名。
  3. Using除非您需要在它们之间交错代码,否则您不需要嵌套块。一条Using语句可以创建任意数量的对象。
  4. 不要多次使用相同的复杂表达式。使用With块或将表达式分配给变量,然后多次使用。
  5. 不要使用多步代码来创建和添加参数,除非这些步骤位于不同的位置。否则,调用Add它将返回新的参数对象,然后您可以设置其Value属性。还要指定可变大小数据类型的大小。我以 50 为例,但您应该使用数据库中自己的大小。
  6. ExecuteScalar可用于执行任何查询,但只会返回结果集第一行的第一列。如果没有行,DBNull.Value则返回。该值作为Object引用返回,因此您需要将其转换为数据的实际类型。如果结果为 NULL,则该强制转换无效,因此请注意您是否需要允许这样做。

有关更多 ADO.NET 示例,请参见此处


推荐阅读