语句执行期间的MS Access管理状态

时间:2014-08-19 13:56:34

标签: sql excel vba ms-access locking

背景

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

  • 基于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

1 个答案:

答案 0 :(得分:2)

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

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

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

可以找到更多信息here.