MSAccess 2010 VBA 打开只读数据库

MSAccess 2010 VBA Open a read-only database

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

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

所以它就在那里崩溃,即使 'True' 告诉它以只读方式打开数据库。我收到 'Run time error 3050 - could not lock file' 错误消息。

我做错了什么?

您已经知道如何设置 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)

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