Excel VBA 连接到 MS Access(读/写)到多用户表/查询
Posted
技术标签:
【中文标题】Excel VBA 连接到 MS Access(读/写)到多用户表/查询【英文标题】:Excel VBA Connection to MS Access (Read/Write) to Multi User Tables/ Queries 【发布时间】:2014-04-22 08:45:58 【问题描述】:我已经试图弄清楚为什么我无法从 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 机器上测试的环境,但这将是最终目标。也许它可以在目标环境上工作,但还不能测试,因为这是最后一步,解决测试环境中代码的任何问题是我目前的首要任务。
罗斯
【问题讨论】:
更多调查 - 如果我在连接到同一个 .accdb 文件的两台机器上运行 MS Access,然后更新一台机器上的“登录”字段 - 它不会显示在另一台机器上- 就像我的 Excel VBA 体验一样。所以我认为问题可能回到.accdb 的设置中。我在正确的轨道上吗?我必须以某种方式设置数据库才能使其正常工作吗? 【参考方案1】:我看到这篇文章很旧,所以你可能已经继续前进了,但我想我会回答以防它对某人有所帮助。我一直在调查一个类似的问题,其中光标位置和锁定类型似乎被正确指定,但有时我仍然会得到不一致的读取结果。我不是专家,但这可能与 JET/ACE/Access 数据库相关的缓存刷新和写入延迟有关。您可能想尝试一下 Page Timeout 和 Flush Transaction Timeout 设置,并考虑在读取之前使用 DBEngine.Idle dbRefreshCache 语句 - 尽管这是 DAO 功能。
【讨论】:
以上是关于Excel VBA 连接到 MS Access(读/写)到多用户表/查询的主要内容,如果未能解决你的问题,请参考以下文章
如何使用sql语句和vba将数据从MS-Access导入excel power查询?
在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异
奇怪的情况,使用 ADO 在 Excel VBA 中定义连接到 Access .accdb 数据库的文件路径,但是它告诉我找不到 .mdb 文件