VBA 多个用户使用 DAO 更新共享 MS-Access 数据库中的同一表



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

最新更新