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

opposite在Python和MS Access VBA之间的OLEDB/ODBC工作,python,vba,ms-access,odbc,oledb,Python,Vba,Ms Access,Odbc,Oledb,其他更高级的程序员: 如果这看起来像是Python32位/64位ODBC/OLEDB Windows的问题,请原谅我,但我尝试搜索论坛,但找不到问题的原因 基本上,我尝试先通过ODBC使用PyODBC模块连接一个非常简单的Python脚本,然后再通过OLEDB使用adodbapi模块,这两种方法都尝试连接到MS Access 2010.accdb数据库。但是,对于OLEDB,我始终得到“未找到提供程序”。“它可能安装不正确”错误。对于ODBC,我始终会收到“未找到数据源名称且未指定默认驱动程序”

其他更高级的程序员:

如果这看起来像是Python32位/64位ODBC/OLEDB Windows的问题,请原谅我,但我尝试搜索论坛,但找不到问题的原因

基本上,我尝试先通过ODBC使用PyODBC模块连接一个非常简单的Python脚本,然后再通过OLEDB使用adodbapi模块,这两种方法都尝试连接到MS Access 2010.accdb数据库。但是,对于OLEDB,我始终得到“未找到提供程序”。“它可能安装不正确”错误。对于ODBC,我始终会收到“未找到数据源名称且未指定默认驱动程序”

然而,深入挖掘,一些不同寻常的事情发生了。在Python中,JET.OLEDB.4.0适用于.mdb文件,而ACE.OLEDB.12.0不适用于.accdb文件。然而,当我运行Access VBA ADODB连接时,情况正好相反

我的环境包括:

  • Python3.4-32位
  • pywin32-219(随安装后一起安装)
  • Microsoft Office 2010 64位
  • 视窗7
是的,我下载并成功安装了AccessDatabaseEngine_x64.exe。是的,我将ODBC数据源指向%Win%/SysWOW64。是的,我在前面提到的文件夹中的odbcad32.exe中看到了mdb和accdb的访问驱动程序和数据源。是的,我在regedit中看到Access(*mdb)和Access(*mdb,*accdb)数据源和Access驱动程序的注册表项。是的,我重新启动并关闭了我的机器

OLEDB
以下是返回“未找到提供程序错误…”的连接字符串:

不过,值得注意的是,以下连接字符串非常有效,但当然仅适用于.mdb文件:

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

ODBC
以下是返回“未找到数据源名称…”的我的连接字符串:

与上面一样,以下操作非常理想,但仅适用于.mdb文件:

import adodbapi
databasename = 'D:\otherdirectorypath\OtherDatabaseName.mdb' 
constr = 'Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s'  % databasename 
db = adodbapi.connect(constr)
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)
代码返回错误-“找不到提供程序”或“无法加载指定的驱动程序”:


ACE.OLEDB.12.0 VS ACE.OLEDB.14.0
最后,在AccessVBA中,只有提供程序:Microsoft.ACE.OLEDB.12.0可以工作,我认为它与MSAccess2007相对应。但是,提供程序:Microsoft.ACE.OLEDB.14.0不适用于我安装的MS Access 2010。有什么原因吗?

结论
我知道ActiveX库与Python的模块库是不同的技术,Microsoft不允许同时使用x32位和x64位的组件,但为什么我不能得到预期的结果呢。我曾考虑过AccessDatabaseEngine_x64.exe/passive,但我听到了奇怪的Office结果。我需要为64位安装Python3.4吗?请帮助或建议!谢谢。

简短回答:

是的,如果您安装了64位Office,并且希望从Python操作Access数据库,那么您应该运行64位版本的Python

详细回答:

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

老的“喷气机”司机

ODBC:Driver={Microsoft Access驱动程序(*.mdb)}
OLEDB:Provider=Microsoft.Jet.OLEDB.4.0
。。。作为Windows操作系统的一个组成部分安装,但它们仅适用于32位应用程序

您安装了64位Office,因此您拥有64位版本的较新的“ACE”驱动程序

ODBC:Driver={Microsoft Access驱动程序(*.mdb,*.accdb)}
OLEDB:Provider=Microsoft.ACE.OLEDB.12.0
。。。而且它们仅适用于64位应用程序

您当前的32位Python环境可以使用Jet驱动程序,但不能使用ACE驱动程序


您拥有64位版本的Access,因此您的VBA代码在64位的世界中运行,它可以使用ACE驱动程序,但不能使用Jet驱动程序。

很好。我只能补充一点,syswow odbc仅适用于x32,不会与ACE x64一起使用。Once可以在odbc syswow管理器中创建条目,但它们仅适用于x32。基本问题是,任何jet/ace ODBC驱动程序最终都将解析为文件的完整路径名,如果已安装x64 ace,则只能使用x64进程内软件。虽然ODBC x32可以说连接到sql server x32/x64,“大多数”ODBC驱动程序都可以,但要读取accDB文件,ACE将“在进程中”运行,就像在代码中调用sub一样。因此,位大小必须匹配。因此,这里不能使用x64位版本的office/ACE。谢谢Gord!为64位安装Python3.4非常有效!现在无法找到提供程序JET.OLEDB.4.0,但可以找到ACE.OLEDB.12.0。ODBC中的驱动程序也是如此。
“其他更高级的程序员”
这就是我的想法。
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)