Excel 崩溃,当多个用户尝试使用 DAO 更新共享 MS-Access 数据库中的同一表时,VBA 会引发错误 3218"无法更新"记录锁定错误。
我有一个这样的特殊配置:位于共享网络文件夹中的MS-Access数据库,多个用户连接以使用Excel文件上的VBA DAO构建来更新该数据库。每个Excel文件中的VBA代码是相同的。当有 2 个用户同时单击更新按钮时,就会出现问题。用户 Excel 文件挂起,或显示错误 3218"无法更新"。
Sub ExportToAccess()
Dim oSelect As Range, i As Long, j As Integer, sPath As String
'tblSuppliers.Active
Set oSelect = Application.InputBox("Range", , Range("A1").CurrentRegion.Address, , , , , 8)
Dim oDAO As DAO.DBEngine, oDB As DAO.Database, oRS As DAO.Recordset
sPath = "\sharedfolderDatabase.accdb"
Set oDAO = New DAO.DBEngine
Set oDB = oDAO.OpenDatabase(sPath)
Set oRS = oDB.OpenRecordset("tblSuppliers")
For i = 2 To oSelect.Rows.Count 'skip label row
oRS.AddNew
For j = 1 To oSelect.Columns.Count 'Field(0) is Auto#
oRS.Fields(j) = oSelect.Cells(i, j)
Next j
oRS.Update
Next i
oDB.Close
MsgBox ("Updated Done!")
End Sub
我知道我的配置不适合数据库应用程序,但是我必须坚持一段时间。在这种情况下,您能否建议任何解决方案以避免多个用户更新Access数据库时出错?有没有办法检测数据库是否正在被其他人更新,并脚本等到该过程首先完成。欢迎针对此问题的任何技术解决方案!谢谢!
您需要某种类型的标志来判断是否有人正在更新表。 此标志的示例:
- 一个Excel文件单元格
- (在您的情况下,这可能是最简单的;如果使用多个Excel文件,只需链接到一个单元格(
- Access 表中的字段(甚至是具有单个字段和专用于此的单个记录的表(
- 共享云端硬盘中的(文本(文件(标志可以是文件的内容,甚至可以是文件是否存在(
然后,您的更新过程将是:
- Check the flag, if set, loop until flag is cleared
- Set the flag
- Update the table
- Clear the flag
您可能还需要某种方式让用户(或只是您(手动清除标志,以防在更新表时出现其他问题并且标志卡住。
好吧,这可能不是最优雅的解决方案
但是您可以在表中创建一个字段,并在使用表之前请求它
像这样:
Set LockedStatus= oDB.OpenRecordset("mycontroltable")
if LockedStatus("lockedSuppiers")=False then
oDB.Execute"update mycontroltable set lockedSuppiers=true"
Set oRS = oDB.OpenRecordset("tblSuppliers")
For i = 2 To oSelect.Rows.Count 'skip label row
oRS.AddNew
For j = 1 To oSelect.Columns.Count 'Field(0) is Auto#
oRS.Fields(j) = oSelect.Cells(i, j)
........
......
oDB.Execute"update mycontroltable set lockedSuppiers=false"
end if