语句执行期间的 MS 访问管理员状态



Background

我开发了许多战术数据采集工具,所有这些工具都使用相同的拆分前端和后端方法,如下所示:

  • 基于 Excel VBA 表单的前端(使用 ADO 连接到后端(
  • 访问 2007 (accdb( 数据库作为后端

我的偏好是使用SQL Server作为后端,但由于我无法解决的限制,这是不可能的。

每个分发的工具都有不同数量的用户同时使用这些工具(介于 10 - 300+ 之间(。我知道 Access 不是提供潜在并发用户数量的理想解决方案,但再一次,这是我无法控制的。

使用工具时,用户有时会收到The database has been placed in a state by user 'Admin' on machine '***' that prevents it from being opened or locked.错误。

考虑到交易量,错误大约发生在 0.001% 的时间内。

我已经阅读了许多关于该主题的文章,其中大多数文章都假设数据库中的对象正在被修改,或者用户正在输入Design Mode这应该通过具有单独的前端和后端来解决。

问题

会发生许多不同类型的查询,包括SELECTINSERT INTO语句。用户不直接访问数据库文件,因此没有对象被修改,也没有放入Design Mode因此用户为什么会遇到此错误?是由于用户数量过多吗?

我使用以下方法使用相同的方法连接到数据库:

Public Function fGetOrderStatus() As Variant()
Dim oDB As ADODB.Connection
Dim oCM As ADODB.Command
Dim oRS As ADODB.Recordset
On Error GoTo Err:
Set oDB = New ADODB.Connection
oDB.Open gcConn
Set oCM = New ADODB.Command
With oCM
    .ActiveConnection = oDB
    .CommandText = "SELECT OrderStatusId, OrderStatus FROM ct_elh_OrderStatus WHERE Deleted Is Null"
    .CommandType = adCmdText
    Set oRS = .Execute
End With
If Not oRS.BOF And Not oRS.EOF Then
    fGetOrderStatus = oRS.GetRows()
Else
    Erase fGetOrderStatus
End If
oRS.Close
Set oRS = Nothing
oDB.Close
Set oDB = Nothing
Exit Function
Err:
    MsgBox ("An unexpected error occurred. Please try again later."), vbCritical, "Error"
End Function

以下似乎是导致此错误的原因:

Jet 在 MDB 标头中锁定一个 256 位的块。此位块中包含指示"被动关机"的位,这会导致出现"症状"一节中描述的错误消息。您可能有用户快速打开和关闭 MDB 文件,并且位解锁速度不够快。当用户尝试打开MDB文件时,如果程序无法读取位,Jet假定用户处于"被动关机"或"管理模式",因此不会让用户打开MDB文件。

此错误似乎是由于您快速打开和关闭数据库,尤其是在涉及多个用户的情况下。为什么不在打开用户前端时打开连接,在用户希望退出时关闭连接?

更多信息可在此处找到。

最新更新