1

Тема: VBS: как открыть файл .MDB через ADODB только на чтение?

Коллеги подскажите как обойти такую проблему:

Для открытия файла с базой MDB используется следующий код (выдержка):


set cnn1 = WScript.CreateObject("ADODB.Connection")
cnn1.Mode = 1 ' adModeRead
cnn1.Provider = "Microsoft.Jet.OLEDB.4.0"
cnn1.Open "Data Source=\\server\share1\folder2\info.mdb" 

Доступ к сетевому ресурсу \\server\share1\, на котором лежит база имеется только на чтение.
Если этот файл ни кем не открыт, то всё ок - подключаемся и считываем информацию
Если же с файлом кто-то работает, то при попытке открыть файл получаю сообщение:

Microsoft JET Database Engine   Erorr description: Невозможно использовать ''; файл уже используется.

На форуме уже обсуждали подобную проблему здесь, но там так и не нашли решения в лоб, к тому же
1. мне не нужно ничего писать в MDB-файл.
2. Да, я знаю что если получить доступ к созданию/изменению файла \\server\share1\folder2\info.ldb, то всё будет работать.

Есть какие-то идеи как получить данные из файла MDB без изменения прав доступа к сетевому ресурсу?

2

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

yuriy2000 пишет:

Если же с файлом кто-то работает…

Что подразумевается под «работает»? Как именно «кто-то» открывает этот файл?

3 (изменено: yuriy2000, 2012-12-28 05:45:01)

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

alexii пишет:

Что подразумевается под «работает»? Как именно «кто-то» открывает этот файл?

Этому "Кому-то" достаточно  просто открыть этот MDB-файл в программе Access и уже метод open выдает ошибку

4

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

yuriy2000, проверил несколько раз. У меня в предложенных Вами условиях и на Вашем коде ошибки не возникает.

5

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

alexii пишет:

yuriy2000, проверил несколько раз. У меня в предложенных Вами условиях и на Вашем коде ошибки не возникает.

Хм, странно..., я сам тоже проверял - беру свой же каталог объявляю сетевым ресурсом и подключаю его как сетевой диск с доступом только на чтение, если файл не открыт - скрипт отрабатывает нормально, но стоит только открыть базу в программе Access - скрипт выдает ошибку!

6

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

На всякий случай: я открывал файл посредством Microsoft Access из комплекта Office 2003. Доменная структура сети. Как сетевой диск ресурс не подключал — открывал по UNC-имени.

7

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

Реально у меня тоже домен и этот файл активно использует, в т.ч. добавляет записи, несколько человек (у них имеются права на запись на этот ресурс).   Это я просто пытался тестировать на своем ПК.

Ладно вопрос задам по другому.  Других способов доступа к MDB нет?

8 (изменено: omegastripes, 2013-01-10 19:12:46)

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

yuriy2000 пишет:

Других способов доступа к MDB нет?

Если размер файла .mdb невелик, и информация считывается нечасто, тогда перед подключением копируйте, например, средствами fso требуемый файл на локальный диск и пользуйтесь сколько угодно. Костыль банален и непродуктивен, но работает безотказно

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

9

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

yuriy2000 пишет:

Других способов доступа к MDB нет?

Опираясь на различные источники, могу предположить, что создание .ldb файла - дело рук Jet Engine, ODBCDirect может подключаться к ISAM базам данных без использования Jet, вероятно, будет достаточно доступа только на чтение? Однако, как задействовать ODBCDirect, да еще и в скриптовой среде - подсказать не могу.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

10

Re: VBS: как открыть файл .MDB через ADODB только на чтение?

omegastripes пишет:

как задействовать ODBCDirect

Проверил подключение через ODBCDirect. Результат отрицательный.

Расшарил в домашней сети с другого компа (Win7 x64) папку \\HP\tmpmdb\ с доступом только на чтения, где создал БД database.mdb с таблицей data. На своем компе (Win7 x64) настроил источник данных ODBC c именем Test, драйвером Microsoft Access Driver (*.mdb) и соответсвующим путем к файлу БД в диспетчере C:\WINDOWS\SysWOW64\odbcad32.exe (источник стал виден и в C:\WINDOWS\System32\odbcad32.exe).

Вариант 1. Следующий скрипт отрабатывает без ошибок, если database.mdb не был открыт:

set dbe = createobject("DAO.DBEngine.36")
set wksp = dbe.createworkspace("odbcworkspace", "admin", "", 1) ' dbUseODBC = 1 dbUseJet = 2
set cn = wksp.openconnection("connection1", 1, true, "ODBC;DSN=test;") ' dbDriverNoPrompt = 1
set rs = cn.openrecordset("SELECT * FROM DATA;")
do while not rs.eof
    msgbox rs.fields(0)
    rs.movenext
loop

cn.connect содержит строку "ODBC;DSN=test;DBQ=\\HP\tmpmdb\database.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"
Результат одинаков, как при запуске скрипта под C:\WINDOWS\SysWOW64\wscript.exe, так и C:\WINDOWS\System32\wscript.exe
Пока работает скрипт, и открыто соединение - файл не удается удалить на другом компе с сообщением "Операция не может быть завершена, поскольку этот файл открыт в "System".

Вариант 2. Попытка открыть соединение, когда database.mdb открыт локально на другом компе в MS Access с полным доступом приводит к ошибке скрипта, в коллекции dbe.errors их сразу 3:

S1000: [Microsoft][Драйвер ODBC Microsoft Access] Невозможно использовать '(нет данных)'; файл уже используется.
IM006: [Microsoft][Диспетчер драйверов ODBC] Ошибка SQLSetConnectAttr для драйвера
ODBC - ошибка вызова.

Кстати, если этим скриптом открыть *.mdb в папке с полным доступом, DAO.DBEngine.36 так же, как и ADODB.Connection создает *.ldb.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251