vb.net - 如何从 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
解决方案
如果您想要数据库中的单个值,则创建一个命令对象并调用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
它将返回新的参数对象,然后您可以设置其Value
属性。还要指定可变大小数据类型的大小。我以 50 为例,但您应该使用数据库中自己的大小。 ExecuteScalar
可用于执行任何查询,但只会返回结果集第一行的第一列。如果没有行,DBNull.Value
则返回。该值作为Object
引用返回,因此您需要将其转换为数据的实际类型。如果结果为 NULL,则该强制转换无效,因此请注意您是否需要允许这样做。
有关更多 ADO.NET 示例,请参见此处。
推荐阅读
- android - firebase onDataChange 可以提供空参数吗?
- c# - 元素的分组和排序
- html - 使用打字稿和Angular 2在输入中隐藏“零”值
- websocket - 测量 websocket 传输率
- javascript - 日期的正则表达式和时间的另一个正则表达式
- c# - Unity 游戏统计数据保存
- php - 具有 NOT LIKE 特定 id 的 PHP MySQL 查询
- cuda - libcurand.so.9.2:无法打开共享对象文件:没有这样的文件或目录
- macos - 当我将应用程序拖到垃圾箱时,如何从 LaunchDaemons 中删除 plist 文件
- c# - 微软构建。在构建之前创建 EmbeddedResource