1

我已经试图弄清楚为什么我无法从 Excel(Office 2013)获取多用户读取和更新到 MS Access 表的正确设置。所以我希望这里有人可以提供帮助。

背景 - 我有一个 MS Access 数据库,其中包含在每个用户计算机上运行的 Excel 应用程序使用的表中的所有数据。.accdb 文件位于共享的 QNAP NAS 上。我设计了系统,因此有一个用户列表,可以在启动时通过表单访问,允许用户“登录”到系统。当用户登录时,目的是在此表中记录一个是/否字段,以防止在两台不同的机器上使用相同的用户名访问相同的数据子集。现在这一切都适用于一台机器或一台机器上的多个 excel 实例。当我在多台机器上加载 excel 应用程序时,机器之间的 Yes/No 字段不一致,除非我在机器上停止 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 中打开如下(除非我在他们“登录”后启动应用程序,否则不会显示用户设置为通过是/否字段登录到另一台机器上)

Set rs = New ADODB.Recordset
sSQL = "SELECT [access list].* FROM [access list] where [access list].[user] = '" &        Me.userlist.Text & "';"
rs.Open sSQL, cn, adOpenDynamic, adLockPessimistic
Application.CalculateUntilAsyncQueriesDone ' not sure I need this????

此用户登录的测试是:

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 并查看数据库显示不一致 - 在一台机器上用户已登录,而在另一台机器上用户未登录。我在想它如何连接到访问数据库或访问数据库中的一些我没有正确的设置 - 但这只是一个想法。

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

拉斯

4

1 回答 1

0

我看到这篇文章很旧,所以你可能已经继续前进了,但我想我会回答以防它对某人有所帮助。我一直在调查一个类似的问题,其中光标位置和锁定类型似乎指定正确,但有时我仍然会得到不一致的读取结果。我不是专家,但这可能与 JET/ACE/Access 数据库相关的缓存刷新和写入延迟有关。您可能想尝试使用 Page Timeout 和 Flush Transaction Timeout 设置,并考虑在读取之前使用 DBEngine.Idle dbRefreshCache 语句 - 尽管这是 DAO 功能。

于 2015-09-08T04:24:51.470 回答