如何从 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
- 最近的 VB 版本支持多行
String
文字,它们有助于使 SQL 代码更具可读性。即使在那之前,您仍然可以使用 XML 文字。
- 不要在查询中包含您实际上不需要的列。除非有特殊原因不这样做,否则请将列名用于相应的参数。
- 您不需要嵌套
Using
块,除非您需要在它们之间插入代码。单个 Using
语句可以创建任意数量的对象。
- 不要多次使用相同的复杂表达式。使用
With
块或将表达式分配给变量,然后多次使用。
- 不要使用多步代码来创建和添加参数,除非这些步骤位于不同的地方。否则,调用
Add
它将 return 新的参数对象,然后您可以设置 Value
属性 的。还指定可变大小数据类型的大小。我以 50 为例,但您应该使用数据库中您自己的大小。
ExecuteScalar
可用于执行任何查询,但只会 return 结果集第一行的第一列。如果没有行,DBNull.Value
是 returned。该值被 returned 作为 Object
引用,因此您需要将其转换为数据的实际类型。如果结果为 NULL,该转换将无效,因此请注意您是否需要允许这样做。
有关更多 ADO.NET 示例,请参阅 here。
请允许我证明我是 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
- 最近的 VB 版本支持多行
String
文字,它们有助于使 SQL 代码更具可读性。即使在那之前,您仍然可以使用 XML 文字。 - 不要在查询中包含您实际上不需要的列。除非有特殊原因不这样做,否则请将列名用于相应的参数。
- 您不需要嵌套
Using
块,除非您需要在它们之间插入代码。单个Using
语句可以创建任意数量的对象。 - 不要多次使用相同的复杂表达式。使用
With
块或将表达式分配给变量,然后多次使用。 - 不要使用多步代码来创建和添加参数,除非这些步骤位于不同的地方。否则,调用
Add
它将 return 新的参数对象,然后您可以设置Value
属性 的。还指定可变大小数据类型的大小。我以 50 为例,但您应该使用数据库中您自己的大小。 ExecuteScalar
可用于执行任何查询,但只会 return 结果集第一行的第一列。如果没有行,DBNull.Value
是 returned。该值被 returned 作为Object
引用,因此您需要将其转换为数据的实际类型。如果结果为 NULL,该转换将无效,因此请注意您是否需要允许这样做。
有关更多 ADO.NET 示例,请参阅 here。