如何从 OLE DB 查询中获取数据

How Do I Get Data from OLE DB Query

请允许我证明我是 Visual Basic 和 OLE DB 编码的新手。我的意图是简单地从我 运行 的查询中检索一个字段的值。下面的代码有效,但是 me.I 使用 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

如果您需要数据库中的单个值,那么您可以创建一个命令对象并调用 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 它将 return 新的参数对象,然后您可以设置 Value 属性 的。还指定可变大小数据类型的大小。我以 50 为例,但您应该使用数据库中您自己的大小。
  6. ExecuteScalar 可用于执行任何查询,但只会 return 结果集第一行的第一列。如果没有行,DBNull.Value 是 returned。该值被 returned 作为 Object 引用,因此您需要将其转换为数据的实际类型。如果结果为 NULL,该转换将无效,因此请注意您是否需要允许这样做。

有关更多 ADO.NET 示例,请参阅 here