Excel VBA连接到MS Access(读/写)到多用户表/查询

Excel VBA连接到MS Access(读/写)到多用户表/查询,excel,vba,ms-access,multi-user,record-locking,Excel,Vba,Ms Access,Multi User,Record Locking,我已经想清楚了为什么我无法从Excel(Office 2013)中获取多用户读取和更新MS Access表的正确设置。所以我希望这里有人能帮忙 后台-我有一个MS Access数据库,其中包含每个用户计算机上运行的Excel应用程序使用的表中的所有数据。.accdb文件驻留在共享QNAP NAS上。我设计了这个系统,因此在启动时可以通过表单访问用户列表表,允许用户“登录”到系统。当用户登录时,目的是在此表中记录“是/否”字段,以防止在访问相同数据子集的两台不同计算机上使用相同的用户名。 现在,在

我已经想清楚了为什么我无法从Excel(Office 2013)中获取多用户读取和更新MS Access表的正确设置。所以我希望这里有人能帮忙

后台-我有一个MS Access数据库,其中包含每个用户计算机上运行的Excel应用程序使用的表中的所有数据。.accdb文件驻留在共享QNAP NAS上。我设计了这个系统,因此在启动时可以通过表单访问用户列表表,允许用户“登录”到系统。当用户登录时,目的是在此表中记录“是/否”字段,以防止在访问相同数据子集的两台不同计算机上使用相同的用户名。 现在,在一台机器或一台机器上的多个excel实例上,所有这些都可以正常工作。 在多台计算机上加载excel应用程序时,计算机之间的“是/否”字段不一致,除非我停止计算机上的excel应用程序并重新启动。有时我会在这个多用户设置中遇到访问错误或数据库损坏错误,所以我显然做错了什么,但我无法找出原因。请帮帮我

excel应用程序的连接如下所示:

' connect to the Access database
Set cn = New ADODB.Connection
With cn
 .Provider = "Microsoft.ACE.OLEDB.12.0"
 .Mode = adModeShareDenyNone
 .CursorLocation = adUseServer
 .Open ThisWorkbook.Worksheets("Title").Range("B1") & "cms.accdb"
End With
记录集在excel中打开,如下所示(除非在用户“登录”后启动应用程序,否则不会显示通过“是/否”字段登录到另一台计算机的用户集)

正在登录的此用户的测试为:

If rs.Fields("Logged in").Value = -1 Then
    fname = rs.Fields("user").Value
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
    MsgBox fname & " is already logged in - please select another user or exit"
Else
    userid = rs.Fields("user").Value
    rs.Close
    Set rs = Nothing
    sSQL = "Update [access list] Set [access list].[logged in] = '-1' WHERE [access list].[user] = '" & userid & "'"
    cn.Execute (sSQL)

    MsgBox "Welcome " & userid & "! Starting system for your contracts."
    cn.Close
    Set cn = Nothing
    Unload Me

End If
那么我做错了什么?我尝试了所有不同的方法,但差别不大。(注意——我并不是试图通过两个用户同时登录到同一个用户来测试竞争条件——这种情况不值得关注——这只是我正在实现的一个简单的锁定模型)。我认为我所做的是保持记录级锁定,确保我可以在每台机器上的每个应用程序中看到任何其他用户对记录的更改。我被难住了!打开MS Access并查看数据库显示不一致性-在一台计算机上用户登录,在另一台计算机上用户未登录。我在想我是如何连接到access数据库的,或者access数据库中我没有正确设置的一些设置,但这只是一个想法

最后一个转折点——我的测试环境机器是在VMware Fusion虚拟机中运行Win 8.1/Office 2013的苹果MacBooks。目前我没有在原生Win 8.1机器上测试的环境,但这将是最终的目标。也许它可以在目标环境中工作,但是还不能测试它,因为这是最后一步,解决测试环境中代码的任何问题是我当前的首要任务


Russ

我看到这篇文章很老了,所以你可能已经离开了,但我想我会回答,以防它对别人有帮助。我一直在研究一个类似的问题,其中光标位置和锁类型似乎被正确指定,但有时仍然会得到不一致的读取结果。我不是专家,但这可能与JET/ACE/Access数据库相关的缓存刷新和写入延迟有关。您可能想在页面读取之前使用页面超时和刷新事务超时设置,并考虑使用DbEngult.IDeldBuffCub缓存语句——虽然这是一个DAO特性。

更多的调查——如果我在连接到同一个.ACCDB文件的两台机器上运行MS Access,然后更新“登录”。字段在一台计算机上-它不会显示在另一台计算机上-就像我的Excel VBA体验一样。所以我认为问题可能又回到了.accdb的设置中。我走对了吗?我是否需要设置数据库以使其正常工作?
If rs.Fields("Logged in").Value = -1 Then
    fname = rs.Fields("user").Value
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
    MsgBox fname & " is already logged in - please select another user or exit"
Else
    userid = rs.Fields("user").Value
    rs.Close
    Set rs = Nothing
    sSQL = "Update [access list] Set [access list].[logged in] = '-1' WHERE [access list].[user] = '" & userid & "'"
    cn.Execute (sSQL)

    MsgBox "Welcome " & userid & "! Starting system for your contracts."
    cn.Close
    Set cn = Nothing
    Unload Me

End If