在执行语句期间的MS Access Admin状态

背景

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

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

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

每个分发的工具都有不同数量的用户同时使用这些工具(任何地方在10 – 300+之间)。 据我所知,Access并不是提供可能的并发用户数量的理想解决scheme,但是这再次超出了我的控制范围。

当工具正在使用时,用户有时会收到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这应该通过分开的前后端来解决)为前提。

发生了许多不同types的查询,包括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头中locking一个256位的块。 包含在该块中的位是指示“被动closures”的位,其导致“症状”部分中描述的错误消息发生。 您可能会有快速打开和closuresMDB文件的用户,并且这些位不能够快速解锁。 当用户试图打开MDB文件,如果程序无法读取位,Jet假定用户处于“被动closures”或“pipe理员模式”,因此不会让用户打开MDB文件。

看来这个错误是由于你打开和closures你的数据库的速度很快,特别是如果有多个用户参与。 为什么在打开用户的前端时不能打开连接,并且在用户希望退出时closures连接呢?

更多信息在这里find。