在 VB 中将 OleDbCommand 与 Access DB 结合使用

Using OleDbCommand in VB With Access DB

提问人:Gary Wheeler 提问时间:8/10/2023 最后编辑:June7Gary Wheeler 更新时间:8/11/2023 访问量:63

问:

我正在使用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 实现的

我尝试使用不同的连接,但总是遇到相同的错误。

vb.net ms-access oledbcommand

评论

3赞 dr.null 8/11/2023
不要在类字段中有这个。您必须就地创建、关闭、处置连接。创建带有语句的语句,它将为您完成所有这些工作。是的,不要保持连接。例如,请参阅此处的第三个代码块。_connectionOleDbConnectionUsing
0赞 Gary Wheeler 8/11/2023
每次关闭连接都为我解决了问题。谢谢
0赞 June7 8/11/2023
这回答了你的问题吗?如何使用 ExecuteScalar 计算记录数,如果有多个记录无法插入 MS Access 数据库中 vb.net
0赞 jmcilhinney 8/11/2023
您当然应该关闭连接,但您可能不需要解决此问题。您可能只需要关闭数据读取器。我不明白当你想要的只是计数时,返回读者有什么意义。您也应该使用 Using 语句创建读取器,并返回计数。这正是 ExecuteScalar 在内部所做的。

答:

0赞 jmcilhinney 8/11/2023 #1

使用 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

请注意,连接字符串存储在成员字段中,而不是存储在连接中。使用语句创建的每个对象都释放在相应的语句处。如上所述,如果在创建每个对象和处置每个对象之间不需要任何额外的代码,则可以使用一个块来处理多个对象。UsingEnd UsingUsing

说了这么多,无论如何你都不应该在这种情况下使用。 专门用于获取查询结果集第一行的第一列,这正是您想要的。它基本上做了上面代码所做的事情,即创建一个数据读取器并获取第一个值,但让该方法完成这项工作可以简化您的代码:ExecuteReaderExecuteScalar

Using connection As New OleDbConnection(_connectionString),
      command As New OleDbCommand(sql, connection)
    connection.Open()

    Return CInt(command.ExecuteScalar())
End Using

用于创建连接和命令的语句仍然相同。请注意,在块内有一个是可以的。无论您如何离开块,创建的对象仍将被释放,即使抛出异常也是如此。UsingReturnUsingUsing