在 VB 中使用 OleDbCommand 与 Access DB

问题描述 投票:0回答:1

我正在使用 OleDbCommand 获取表“Select count(MyField1) from MyTable”中的记录计数。使用以下代码。

SQL = "Select count(Field) from Table"
Dim DBcmd As New OleDbCommand(sql, _connection)
Return DBcmd.ExecuteReader

它锁定表,因此无法对其进行修改。我稍后尝试

Alter Table MyTable Alter Column MyField2 Counter(1,1)
。 MyField2 是一个自动编号

我尝试过解决这个问题,但没有成功。有人有什么想法吗?

所有这一切都是通过 VB 和 Access DB 实现的

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

vb.net ms-access oledbcommand
1个回答
0
投票

使用 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
块,即使抛出异常,创建的对象仍将被释放。

© www.soinside.com 2019 - 2024. All rights reserved.