在Python和MS Access VBA之间的OLEDB / ODBC的相反工作

更高级的程序员:

如果这看起来像疲惫的Python 32位/ 64位ODBC / OLEDB Windows问题,请原谅我,但我试图搜索论坛,并不能找到我的问题的原因.

基本上,我尝试使用pypyodbc模块首先通过ODBC连接一个非常简单的Python脚本,然后使用adodbapi模块通过OLEDB连接,尝试连接到MS Access 2010 .accdb数据库.然而,对于OLEDB,我一直得到’找不到提供者.它可能没有正确安装’错误.对于ODBC,我一直收到’未找到数据源名称且未指定默认驱动程序’.

深入挖掘,发生了一些非凡的事情.在Python中,JET.OLEDB.4.0适用于.mdb文件,但不适用于.accdb文件的ACE.OLEDB.12.0.然而,当我运行Access VBA ADODB连接时,恰恰相反!

我的环境包括:

> Python3.4 -32位
> pywin32-219(安装后安装)
> Microsoft Office 2010 64位
> Windows 7

是的,我下载并成功安装了AccessDatabaseEngine_x64.exe.是的,我将ODBC数据源指向%Win%/ SysWOW64.是的,我在上述文件夹中的odbcad32.exe中看到了mdb和accdb的Access驱动程序和数据源.是的,我在注册表中看到了Access(* mdb)和Access(* mdb,* accdb)数据源和Access驱动程序的注册表项.是的,我重新启动并关闭/打开我的机器.

OLEDB
以下是我的连接字符串,它返回’Provider not found error …’:

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
有趣的是,EXACT反向发生在Access VBA模块(当然使用ActiveX数据对象库引用)中,使用相同的连接字符串Driver和Provider.

代码适用于.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)

代码返回错误 – “找不到提供者”或“无法加载指定的驱动程序”:

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中,只有Provider:Microsoft.ACE.OLEDB.12.0可以工作,我认为它与MS Access 2007相对应.但是,提供者:Microsoft.ACE.OLEDB.14.0不适用于我安装的MS Access 2010.有什么理由吗?

结论
我理解ActiveX库是一种与Python模块库不同的技术,微软不允许同时使用x32位和x64位的组件,但为什么我不能得到我想要的结果.我想到了AccessDatabaseEngine_x64.exe /被动,但我听到奇怪的Office结果走了那条路.我是否需要为64位安装Python3.4?请帮忙或建议!谢谢.

解决方法:

简短回答:

是的,为了最大限度地减少麻烦,如果您安装了64位Office并且希望从Python操作Access数据库,那么您应该运行64位版本的Python.

更长的回答:

较旧的“Jet”引擎/驱动程序和较新的Access数据库引擎(a.k.a.“ACE”)引擎/驱动程序是完全独立的实体.

年龄较大的“Jet”司机……

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

…作为Windows操作系统的组成部分安装,但它们仅适用于32位应用程序.

您安装了64位Office,因此您拥有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位Universe中运行,它可以使用ACE驱动程序,但不能使用Jet驱动程序.

上一篇:MySQL ODBC连接字符串中的Option = N是什么?


下一篇:Microsoft Access和Java JDBC-ODBC错误