背景
我开发了许多战术数据捕获工具,所有这些工具都使用相同的分割前端和后端方法,如下所示:
我的偏好是使用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
而结束,这应该通过分开的前端和后端。
问题
发生了许多不同类型的查询,包括SELECT
和INSERT 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
答案 0 :(得分:2)
以下似乎是导致此错误的原因:
Jet在MDB标头中锁定256位的块。此位块中包含指示“被动关闭”的位,这会导致出现“症状”部分中描述的错误消息。您可能有用户可以快速打开和关闭MDB文件,而且这些位没有足够快地解锁。当用户尝试打开MDB文件时,如果程序无法读取这些位,则Jet会假定用户处于“被动关闭”或“管理模式”,因此不会让用户打开MDB文件的
似乎此错误是由于您快速打开和关闭数据库,尤其是涉及多个用户时。 为什么不在打开用户的前端时打开连接,并在用户希望退出时关闭连接?
可以找到更多信息here.