2014-09-20 4 views
2

Fellow более продвинутыми программистами:Oppposite выработок OLEDB/ODBC между Python и MS Access VBA

Пожалуйста, простите меня, если это кажется усталым Python 32-бит/64-битного ODBC/выпуск OLEDB Windows, но я пытался искать форумы и не могут найти причину моей проблемы.

В принципе, я попытался подключить очень простой скрипт Python сначала через ODBC, используя модуль pypyodbc, а затем второй через OLEDB с помощью модуля adodbapi, как попытку базы данных MS Access 2010. .accdb. Однако для OLEDB я постоянно получаю «Провайдер не найден. Возможно, неправильно установлена ​​ошибка «». И для ODBC я последовательно получаю «Имя источника данных не найдено, а драйвер по умолчанию не указан».

Копаем глубже, что-то замечательное произошло. В Python JET.OLEDB.4.0 работает для файлов .mdb, но не ACE.OLEDB.12.0 для файлов .accdb. Тем не менее, точное обратное происходит, когда я запускаю соединение ADOBB Access VBA!

Моя среда включает в себя:

  • Python3.4 -32-разрядное
  • pywin32-219 (устанавливается с после установки)
  • Microsoft Office 2010 64-разрядный
  • Windows 7

Да, я загрузил и успешно установил AccessDatabaseEngine_x64.exe. Да, я указал источники данных ODBC на% Win%/SysWOW64. Да, я вижу драйвер Access и источники данных для mdb и accdb в файле odbcad32.exe в вышеупомянутой папке. Да, я вижу ключи реестра в regedit для источников доступа (* mdb) и Access (* mdb, * accdb) и драйвера доступа. И да, я и перезапустил, и выключил/на моей машине.

OLEDB
Ниже моя строка соединения, которая возвращает 'Provider не найдена ошибка ...:

import adodbapi 
databasename = 'D:\directorypath\DatabaseName.accdb' 
constr = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s' % databasename 
db = adodbapi.connect(constr) 

Замечательно, хотя, следующая строка соединения отлично работает, но, конечно, только с .mdb файлов:

import adodbapi 
databasename = 'D:\otherdirectorypath\OtherDatabaseName.mdb' 
constr = 'Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s' % databasename 
db = adodbapi.connect(constr) 


ODBC
Ниже моя строка соединения, которая возвращает «имя источника данных не найден ...»:

import pypyodbc 
databasename = 'D:\directorypath\DatabaseName.accdb' 
constr = 'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=%s;' % databasename 
db = pypyodbc.connect(constr) 

Как выше, следующие работы идеально, но только для .mdb файлов:

import pypyodbc 
databasename = 'D:\otherdirectorypath\OtherDatabaseName.mdb' 
constr = 'DRIVER={Microsoft Access Driver (*.mdb)};DBQ=%s;' % databasename 
db = pypyodbc.connect(constr) 


доступа VBA
Интересно, что СОВПАД происходит обратное в Ac cess VBA (конечно, с ссылкой на библиотеку объектов ActiveX Data Object), используя те же строки соединений, что и драйвер и поставщик.

код прекрасно работает как для .mdb и .accdb файлов:

Dim constr As String 
Dim CN As ADODB.Connection 
Dim RS As ADODB.Recordset 

constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\databasedirectory\DatabaseName.accdb;Persist Security Info=False" 

' OR constr = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\databasedirectory\DatabaseName.accdb;Persist Security Info=False" 

Set CN = New ADODB.Connection 
CN.Open (constr) 

код возвращает ошибку - 'Provider не найден' или 'Указанный драйвер не может быть загружен':

Dim constr As String 
Dim CN As ADODB.Connection 
Dim RS As ADODB.Recordset 

constr = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=D:\otherdatabasedirectory\OtherDatabaseName.mdb;Persist Security Info=False" 

' OR constr = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=D:\otherdatabasedirectory\OtherDatabaseName.mdb;Persist Security Info=False" 

Set CN = New ADODB.Connection 
CN.Open (constr) 


ACE.OLEDB.12.0 VS ACE.OLEDB.14.0
Наконец, все еще в Access VBA, только Провайдер: Microsoft.ACE.OLEDB.12.0 работает, который, как мне показалось, соответствует MS Access 2007. Однако поставщик: Microsoft.ACE.OLEDB.14.0 не работает для моего установленного MS Access 2010. Любые причины для этого?

Заключение
Я понимаю библиотека ActiveX это другая технология, чем библиотеки модулей Python и Microsoft не позволяет одновременное использование компонентов в x32-битных и 64-битных, но почему я не могу получить желаемый результат , Я подумал о AccessDatabaseEngine_x64.exe/passive, но я слышу странные результаты Office, идущие по этому маршруту. Нужно ли устанавливать Python3.4 для 64-битного? Пожалуйста, помогите или предложите! Благодарю.

+0

'' Более продвинутые программисты. '' Ну, это я из картинки. – RossC

ответ

2

Короткий ответ:

Да, чтобы свести к минимуму головных болей, вы должны работать под управлением 64-разрядную версию Python в случае, если установлен 64-разрядный офис, и вы хотите, чтобы управлять базами данных Access с Python.

Более длинный ответ:

Старшее "Jet" двигатель/драйверы и новые базы данных Access Engine (а.к.а. "ACE") двигатель/водители совершенно разные сущности.

Старшие "Jet" драйверы ...

ODBC: Driver={Microsoft Access Driver (*.mdb)} 
OLEDB: Provider=Microsoft.Jet.OLEDB.4.0 

... установлены в качестве составной части операционной системы Windows, но они доступны только для 32-битных приложений.

Вы установили 64-разрядное управление, поэтому у вас есть 64-разрядная версия новых «ACE» водители ...

ODBC: Driver={Microsoft Access Driver (*.mdb, *.accdb)} 
OLEDB: Provider=Microsoft.ACE.OLEDB.12.0 

... и они доступны только для 64-битных приложений ,

Ваша текущая 32-разрядная среда Python может использовать драйвера Jet, но не водитель ACE

У вас есть 64-битная версия Access, поэтому ваш код VBA работает в 64-битном вселенной, и это может используйте драйверы ACE, но не драйверы Jet.

+1

Хороший звонок. Я могу только добавить, что syswow odbc только x32 и не будет работать с ACE x64. После этого можно создать записи в менеджере syswow odbc, но они предназначены для ТОЛЬКО x32. Основная проблема заключается в том, что любой драйвер ODBC с двигателем/тузом в конечном итоге разрешит полное имя пути в качестве файла, и если у вас установлен x64 ace, тогда вы можете использовать только встроенное программное обеспечение x64. В то время как ODBC x32 может говорить о подключении к серверу sql x32/x64 и «большинству» драйверов odbc, чтобы читать файл accDB, ACE запускается «in-process» и, как если бы вы вызывали sub в одном коде. Таким образом, размер бит должен совпадать.Таким образом, здесь нельзя использовать 64-разрядную версию Office/ACE. –

+0

Спасибо, Горд! Установка Python 3.4 для 64-битной работы отлично! Теперь провайдер JET.OLEDB.4.0 не может быть найден, но ACE.OLEDB.12.0 может. То же самое касается драйверов в ODBC. – Parfait