提问人:Gary Wheeler 提问时间:8/10/2023 最后编辑:June7Gary Wheeler 更新时间:8/11/2023 访问量:63
在 VB 中将 OleDbCommand 与 Access DB 结合使用
Using OleDbCommand in VB With Access DB
问:
我正在使用OleDbCommand获取表“从MyTable中选择count(MyField1)”中的记录计数。使用以下代码。
SQL = "Select count(Field) from Table"
Dim DBcmd As New OleDbCommand(sql, _connection)
Return DBcmd.ExecuteReader
它锁定了表,因此无法修改。我后来尝试.MyField2 是自动编号Alter Table MyTable Alter Column MyField2 Counter(1,1)
我试图解决这个问题,但没有运气。有人有什么想法吗?
所有这些都是通过 VB 和 Access DB 实现的
我尝试使用不同的连接,但总是遇到相同的错误。
答:
使用 ADO.NET 时,您几乎应该始终在需要的地方创建、使用和销毁数据访问对象。如果创建自己的数据访问层,则意味着在获取或保存数据的每个方法中执行此操作。在这种情况下,您应该创建、使用和销毁所有三个连接、命令和数据读取器。当接收数据读取器的代码只需要从中获取计数时,返回整个数据读取器是没有意义的。自己计算并返回计数更有意义。然后,您可以自行关闭数据读取器。几乎可以肯定是开放数据读取器锁定了您的表,而不是打开的连接。关闭连接也会关闭数据读取器,但无论如何您都应该这样做。
Using connection As New OleDbConnection(_connectionString),
command As New OleDbCommand(sql, connection)
connection.Open()
Using reader = command.ExecuteReader()
reader.Read()
Return reader.GetInt32(0)
End Using
End Using
请注意,连接字符串存储在成员字段中,而不是存储在连接中。使用语句创建的每个对象都释放在相应的语句处。如上所述,如果在创建每个对象和处置每个对象之间不需要任何额外的代码,则可以使用一个块来处理多个对象。Using
End Using
Using
说了这么多,无论如何你都不应该在这种情况下使用。 专门用于获取查询结果集第一行的第一列,这正是您想要的。它基本上做了上面代码所做的事情,即创建一个数据读取器并获取第一个值,但让该方法完成这项工作可以简化您的代码:ExecuteReader
ExecuteScalar
Using connection As New OleDbConnection(_connectionString),
command As New OleDbCommand(sql, connection)
connection.Open()
Return CInt(command.ExecuteScalar())
End Using
用于创建连接和命令的语句仍然相同。请注意,在块内有一个是可以的。无论您如何离开块,创建的对象仍将被释放,即使抛出异常也是如此。Using
Return
Using
Using
评论
_connection
OleDbConnection
Using