资深的程序员:
如果这看起来像是疲惫的Python 32位/ 64位ODBC / OLEDB Windows问题,请原谅我,但是我尝试搜索论坛,但找不到引起我问题的原因。
基本上,我尝试首先使用pypyodbc模块通过ODBC连接非常简单的Python脚本,然后尝试使用adodbapi模块通过OLEDB连接非常简单的Python脚本,两者均尝试连接到MS Access 2010 .accdb数据库。但是,对于OLEDB,我始终得到“未找到提供者”。可能未正确安装”错误。对于ODBC,我始终收到“未找到数据源名称且未指定默认驱动程序”的信息。
深入挖掘,虽然发生了一些非凡的事情。在Python中,JET.OLEDB.4.0适用于.mdb文件,但不适用于ACE.OLEDB.12.0适用于.accdb文件。但是,当我运行Access VBA ADODB连接时,情况恰好相反!
我的环境包括:
是的,我下载并成功安装了AccessDatabaseEngine_x64.exe。是的,我将ODBC数据源指向%Win%/ SysWOW64。是的,我在上述文件夹的odbcad32.exe中看到了mdb和accdb的访问驱动程序和数据源。是的,我在regedit中看到Access(* mdb)和Access(* mdb,* accdb)数据源以及Access驱动程序的注册表项。是的,我都重新启动并关闭了机器。
OLEDB
以下是我的连接字符串,它返回“找不到提供程序错误...”:
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
有趣的是,使用驱动程序和提供程序使用相同的连接字符串,在Access VBA模块(当然带有ActiveX数据对象库引用)中会发生完全相反的情况。
代码对于.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中,只有提供程序:Microsoft.ACE.OLEDB.12.0起作用,我认为它对应于MS Access2007。但是,提供程序:Microsoft.ACE.OLEDB。 14.0不适用于我安装的MS Access2010。这是什么原因?
结束语
我了解ActiveX库与Python的模块库是一种不同的技术,并且Microsoft不允许同时使用x32位和x64位的组件,但是为什么我无法获得预期的结果。我考虑过AccessDatabaseEngine_x64.exe / passive,但是我听到奇怪的Office结果沿这条路线走了。我需要为64位安装Python3.4吗?请帮忙或建议!谢谢。
简短答案:
是的,如果您安装了64位Office并希望通过Python操作Access数据库,则应尽量减少运行64位版本的Python的麻烦。
更长的答案:
较旧的“ Jet”引擎/驱动程序和较新的“访问数据库引擎”(又称为“ ACE”)引擎/驱动程序是完全独立的实体。
较旧的“ Jet”驱动程序...
ODBC: Driver={Microsoft Access Driver (*.mdb)}
OLEDB: Provider=Microsoft.Jet.OLEDB.4.0
...作为Windows操作系统的组成部分安装,但是它们仅适用于32位应用程序。
您已经安装了64位Office,因此您具有较新的“ ACE”驱动程序的64位版本...
ODBC: Driver={Microsoft Access Driver (*.mdb, *.accdb)}
OLEDB: Provider=Microsoft.ACE.OLEDB.12.0
...并且它们仅适用于64位应用程序。
您当前的32位Python环境可以使用Jet驱动程序,但不能使用ACE驱动程序
您具有Access的64位版本,因此您的VBA代码在64位Universe中运行,并且可以使用ACE驱动程序,但不能使用Jet驱动程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句