MSAccess 2010 VBA打开只读数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSAccess 2010 VBA打开只读数据库相关的知识,希望对你有一定的参考价值。

我有一个MS Access数据库,我试图从存在于只读文件夹中的另一个MS Access数据库中提取存档数据。所以......

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

所以它就在那里陨石坑,即使'True'告诉它以只读方式打开数据库。我收到'运行时错误3050 - 无法锁定文件'错误消息。

我究竟做错了什么?

答案

您已经知道如何设置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:UsersJuneSample.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:UsersJuneSample.accdb")
Set DAOrs = DAOdb.OpenRecordset("SELECT * FROM Table1", dbOpenSnapshot)

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

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = OpenDatabase("C:UsersJuneSample.accdb")
Set rs = db.OpenRecordset("Table1")

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

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

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

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

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

以上是关于MSAccess 2010 VBA打开只读数据库的主要内容,如果未能解决你的问题,请参考以下文章

excel中使用vba以只读方式打开工作薄的操作方法

MS Access VBA 文件对话框崩溃

MS Access 2010 vba 查询

使用 VBA 的 MS Access 打印报告

通过 VBA 自动使用查询从 Ms Access 2007 生成报告

在access vba中输出多个报告会导致错误3014,打开的表太多