【问题标题】:Oppposite Workings of OLEDB/ODBC between Python and MS Access VBAPython和MS Access VBA之间OLEDB/ODBC的对立工作
【发布时间】:2014-09-20 18:17:34
【问题描述】:

与更高级的程序员同行:

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

基本上,我首先尝试使用 pypyodbc 模块通过 ODBC 连接一个非常简单的 Python 脚本,然后使用 adodbapi 模块通过 OLEDB 连接第二个脚本,两者都尝试连接到 MS Access 2010 .accdb 数据库。但是,对于 OLEDB,我始终找不到 'Provider。它可能没有正确安装'错误。对于 ODBC,我始终收到 “未找到数据源名称且未指定默认驱动程序”

深入挖掘,发生了一些了不起的事情。在 Python 中,JET.OLEDB.4.0 适用于 .mdb 文件,而 ACE.OLEDB.12.0 适用于 .accdb 文件。然而,当我运行 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 驱动程序和数据源。是的,我在 regedit 中看到了 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
以下是我返回'Data source name not found...'的连接字符串:

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 中,只有我认为对应于 MS Access 2007 的 Provider: Microsoft.ACE.OLEDB.12.0 有效。但是,Provider: Microsoft.ACE.OLEDB.14.0 不适用于我安装的 MS Access 2010。这有什么原因吗?

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

【问题讨论】:

  • "Fellow more advanced programmers" 那是我的照片。

标签: python vba ms-access odbc oledb


【解决方案1】:

简答:

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

更长的答案:

较旧的“Jet”引擎/驱动程序和较新的 Access 数据库引擎(也称为“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 位世界中运行,它可以使用 ACE 驱动程序,但不能使用 Jet 驱动程序。

【讨论】:

  • 好电话。我只能补充说 syswow odbc 仅适用于 x32,不适用于 ACE x64。一旦可以在 odbc syswow 管理器中创建条目 - 但它们仅适用于 x32。基本问题是任何 jet/ace ODBC 驱动程序最终都会解析为文件的完整路径名,如果您安装了 x64 ace,那么您只能使用 x64 进程内软件。虽然 ODBC x32 可以说连接到 sql server x32/x64 并且“大多数”odbc 驱动程序可以,但要读取 accDB 文件,则 ACE 会在“进程内”运行,就好像您在代码中调用了 sub。因此位大小必须匹配。因此这里不能使用 x64 位版本的 office/ACE。
  • 感谢上帝!为 64 位安装 Python 3.4 效果很好!现在找不到提供程序 JET.OLEDB.4.0 但可以找到 ACE.OLEDB.12.0。 ODBC 中的驱动程序也是如此。
猜你喜欢
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多