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
这应该通过具有单独的前端和后端来解决。
问题
会发生许多不同类型的查询,包括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
以下似乎是导致此错误的原因:
Jet 在 MDB 标头中锁定一个 256 位的块。此位块中包含指示"被动关机"的位,这会导致出现"症状"一节中描述的错误消息。您可能有用户快速打开和关闭 MDB 文件,并且位解锁速度不够快。当用户尝试打开MDB文件时,如果程序无法读取位,Jet假定用户处于"被动关机"或"管理模式",因此不会让用户打开MDB文件。
此错误似乎是由于您快速打开和关闭数据库,尤其是在涉及多个用户的情况下。为什么不在打开用户前端时打开连接,在用户希望退出时关闭连接?
更多信息可在此处找到。