excel - 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 数据库时,您能否建议任何解决方案以避免错误?有没有办法检测数据库是否正在被其他人和脚本更新,以等待该过程首先完成。欢迎任何针对此问题的技术解决方案!谢谢!
解决方案
您需要某种类型的标志来判断是否有人正在更新表格。这个标志可以是什么的例子:
- 一个 Excel 文件单元格(在您的情况下这可能是最简单的;如果使用多个 Excel 文件,只需链接到一个单元格)
- Access 表中的字段(即使是具有单个字段和专用于该字段的单个记录的表)
- 共享驱动器中的(文本)文件(标志可以是文件的内容,甚至是文件是否存在)
那么您的更新过程将是:
- Check the flag, if set, loop until flag is cleared
- Set the flag
- Update the table
- Clear the flag
您可能还需要一些方法让用户(或只是您)手动清除标志,以防在更新表时出现其他问题并且标志被卡住。
推荐阅读
- r - 替换不完全是 10 位的电话号码
- r - 仅绘制平滑线?
- angular - 如何在 Mat-table angular 5 中设置序列号
- annotations - 如何识别itext中的“回复”注释
- php - 如何在 jquery 脚本中嵌入 PHP?
- jquery - 如果我选择 1 月作为月份,2018 年作为年份,那么只显示 2018 年 1 月的完整日历
- postgresql - 从链接字符串中提取变量值
- php - Paytabs 支付网关 Api 无法正常工作
- node.js - 找不到模块'dialogflow-fulfillment'
- android - 如何在 Android.MK 文件中使用 -assumenosideeffects 标志启用 proguard