在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驱动程序.
标签:python,ms-access,vba,odbc,oledb 来源: https://codeday.me/bug/20191008/1875017.html