【问题标题】:VBA multiple users to update same table in a shared MS-Access database using DAOVBA 多个用户使用 DAO 更新共享 MS-Access 数据库中的同一个表
【发布时间】:2019-07-24 10:02:24
【问题描述】:

当多个用户尝试使用 DAO 更新共享 MS-Access 数据库中的同一个表时,Excel 崩溃,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 数据库时,您能否建议任何解决方案以避免错误?有没有办法检测数据库是否正在被其他人更新,并且脚本要等到该过程首先完成。欢迎任何针对此问题的技术解决方案! 谢谢!

【问题讨论】:

  • 这段代码会导致这个错误,这很奇怪。如果同一个用户按两次按钮会发生什么?
  • 您的代码看起来不错。我不确定您是否可以像这样进行更新,因为有几个人正在共享 Access 文件。当除了你之外没有人打开文件时,你可以试试吗?那应该行得通。此外,在网络驱动器上,我看到了非常奇怪的事情。在我工作的一家公司,我使用的代码运行良好,但同样的代码在另一家公司却无法运行。我猜这与网络的配置方式有关,但我实际上无法证明。

标签: excel vba ms-access


【解决方案1】:

您需要某种类型的标志来判断是否有人在更新表格。此标志的示例:

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

那么您的更新过程将是:

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

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

【讨论】:

    【解决方案2】:

    嗯,这可能不是最优雅的解决方案

    但您可以在表格中创建一个字段,并在使用表格之前询问它

    类似这样的:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多