首页 > 解决方案 > 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 = "\\sharedfolder\Database.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 数据库时,您能否建议任何解决方案以避免错误?有没有办法检测数据库是否正在被其他人和脚本更新,以等待该过程首先完成。欢迎任何针对此问题的技术解决方案!谢谢!

标签: excelvbams-access

解决方案


您需要某种类型的标志来判断是否有人正在更新表格。这个标志可以是什么的例子:

  • 一个 Excel 文件单元格(在您的情况下这可能是最简单的;如果使用多个 Excel 文件,只需链接到一个单元格)
  • Access 表中的字段(即使是具有单个字段和专用于该字段的单个记录的表)
  • 共享驱动器中的(文本)文件(标志可以是文件的内容,甚至是文件是否存在)

那么您的更新过程将是:

- Check the flag, if set, loop until flag is cleared
- Set the flag
- Update the table
- Clear the flag

您可能还需要一些方法让用户(或只是您)手动清除标志,以防在更新表时出现其他问题并且标志被卡住。


推荐阅读