【问题标题】:MSAccess 2010 VBA Open a read-only databaseMSAccess 2010 VBA 打开只读数据库
【发布时间】:2019-07-24 01:31:08
【问题描述】:

我有一个 MSAccess 数据库,我正试图从位于只读文件夹中的其他 MSAccess 数据库中提取归档数据。 所以...

Dim aidbx As DAO.Database
Dim stDB as STring
 stDB = 'path to read-only database
...
Set aidbx = OpenDatabase(stDB, False, True)

所以它就在那里崩溃了,即使“真”告诉它以只读方式打开数据库。我收到“运行时错误 3050 - 无法锁定文件”错误消息。

我做错了什么?

【问题讨论】:

  • 我刚试过设置一个只读文件夹,文件夹不是只读的,文件夹里的文件都是只读的。我测试了你的代码,没有出错。可以在没有连接对象变量的情况下从另一个 db 中提取数据,并且无需实际打开另一个 db。你想做什么,插入现有表还是新表?
  • 不,我只是想提取一些数据。我有类似的代码在excel中运行,没有这个问题。但它使用 ADODB 连接,我注意到如何在 Access 中做到这一点。
  • 为什么不在 Access 代码中使用 ADODB 连接和 ADODB 记录集?为什么使用 DAO 记录集?请参阅答案以获取可能的替代方案。

标签: vba ms-access readonly


【解决方案1】:

您已经知道如何设置 ADODB 连接,因为您已经在 Excel 代码中进行了设置。应该能够在 Access VBA 中使用相同的。使用早期绑定的示例,因此需要设置对Microsoft ActiveX Data Objects x.x Library 的引用:

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='C:\Users\June\Sample.accdb'"
rs.Open "SELECT * FROM Table1", cn, adOpenStatic, adLockReadOnly

以下是在 DAO 工作区中打开 DAO 数据库和记录集对象的示例,从 Access 2013 开始显然不支持:

Dim DAOws As DAO.Workspace
Dim DAOdb As DAO.Database
Dim DAOrs As DAO.Recordset
Set DAOws = DBEngine.Workspaces(0)
Set DAOdb = DAOws.OpenDatabase("C:\Users\June\Sample.accdb")
Set DAOrs = DAOdb.OpenRecordset("SELECT * FROM Table1", dbOpenSnapshot)

使用 DAO 数据库和记录集对象但不使用工作区的示例:

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = OpenDatabase("C:\Users\June\Sample.accdb")
Set rs = db.OpenRecordset("Table1")

Access VBA 可以打开一个记录集对象,该对象通过使用 CurrentDb 对象和 IN 运算符从另一个数据库中提取数据而无需连接和其他数据库对象变量。示例:

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM Table1 IN 'C:\Users\June\Sample.accdb'")

这是对使用 SQL 和 JOIN 的最后一种方法的测试:

Set rs = CurrentDb.OpenRecordset("SELECT Submit.*, [103].* 
         FROM Submit INNER JOIN [103] ON Submit.LabNum=[103].LabNum
         IN 'C:\Users\June\Sample.accdb'", dbOpenSnapshot)

这些方法中的任何一个都可以引用查询而不是表作为源。

【讨论】:

  • 嗨 - 你的最后一个例子确实有效 - 谢谢!但是,我有一个更长的查询,涉及多个表和内部连接等,我无法弄清楚包含 IN 运算符的语法。这适用于远程数据库中的多个表吗?
  • 可能不会。可能必须使用其他选项。我能够从位于后端的查询中提取。
  • 其实,刚刚测试了一下,JOIN 确实有效。请参阅修订后的答案。使用更复杂的查询进行测试。
  • 嘿!我认为它的工作!我需要检查它返回的内容,但至少它可以连接并且不会呕吐!让我感到困惑的最后一部分是 ORDER BY,事实证明,它必须放在文件名之后的最后(不仅仅是之前)。非常感谢您花时间发布这些答案。啤酒给你!
  • 很高兴为您提供帮助。在这个过程中我学到了很多。如果确实需要,请务必将其标记为答案。
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多