MSAccess 2010 VBA Открыть базу данных только для чтения - PullRequest
0 голосов
/ 02 марта 2019

У меня есть база данных MSAccess, в которую я пытаюсь получить архивные данные из других баз данных MSAccess, которые находятся в папках только для чтения.Итак ...

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

Таким образом, он кратер прямо здесь, хотя 'True' говорит ему открыть базу данных только для чтения.Я получаю сообщение об ошибке «Ошибка времени выполнения 3050 - файл не заблокирован».

Что я делаю не так?

1 Ответ

0 голосов
/ 02 марта 2019

Вы уже знаете, как установить соединение 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)

Любой из этих методов может ссылаться на запрос вместо таблицы в качестве источника.

...