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

完美的

资深的程序员:

如果这看起来像是疲惫的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连接时,情况恰好相反!

我的环境包括:

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

是的,我下载并成功安装了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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法与OLEDB与MS Access(.mdb文件)连接

来自分类Dev

与oledb和odbc混淆

来自分类Dev

无法通过C#oledb将记录插入MS Access

来自分类Dev

无法通过VB.NET查看或插入MS Access oledb

来自分类Dev

无法通过C#oledb将记录插入MS Access

来自分类常见问题

C#Access OleDB分别添加时间和日期

来自分类Dev

使用OleDb和Access处理dd / mm / yyyy日期格式

来自分类Dev

C#Access OleDB分别添加时间和日期

来自分类Dev

如何通过OleDb在MS Access上使用公用表表达式执行复杂的SQL查询

来自分类Dev

尝试通过 VBA 和 OLEDB 在 excel 中创建表格

来自分类Dev

Oledb和DATETIME的问题

来自分类Dev

Oledb和DATETIME的问题

来自分类Dev

ACE OLEDB连接到Access Runtime 2016

来自分类Dev

OleDb与Access数据库的连接

来自分类Dev

数据导出到MS ACCESS时,未在本地计算机上注册“ Microsoft.ACE.OLEDB.12.0”提供程序

来自分类Dev

MS Access 2013何时打开和关闭odbc连接?

来自分类Dev

MS Access VBA,SQL脚本:In(),<>和AND语法

来自分类Dev

MS Access VBA IF()

来自分类Dev

通过SQL或OLEDB找出Access表的哪些列是自动递增的?

来自分类Dev

OLEDB-无法在Access数据库中编辑记录

来自分类Dev

VBA中的MS Access 2003刷新链接的ODBC表导致膨胀

来自分类Dev

VBA中的MS Access 2003刷新链接的ODBC表导致膨胀

来自分类Dev

MS Access-VBA-创建新的Excel工作簿

来自分类Dev

C#TransactionScope与OleDB和Oracle

来自分类Dev

在Access中使用ODBC连接到MS SQL Server 2012:手动调用查询和在VBA中之间存在巨大的时差

来自分类Dev

在Access中使用ODBC连接到MS SQL Server 2012:手动调用查询和在VBA中之间存在巨大的时差

来自分类Dev

MS Access数据库和MySql之间同步

来自分类Dev

在两个日期之间选择 MS Access 和 php

来自分类Dev

连接到ODBC时的MS Access错误

Related 相关文章

  1. 1

    无法与OLEDB与MS Access(.mdb文件)连接

  2. 2

    与oledb和odbc混淆

  3. 3

    无法通过C#oledb将记录插入MS Access

  4. 4

    无法通过VB.NET查看或插入MS Access oledb

  5. 5

    无法通过C#oledb将记录插入MS Access

  6. 6

    C#Access OleDB分别添加时间和日期

  7. 7

    使用OleDb和Access处理dd / mm / yyyy日期格式

  8. 8

    C#Access OleDB分别添加时间和日期

  9. 9

    如何通过OleDb在MS Access上使用公用表表达式执行复杂的SQL查询

  10. 10

    尝试通过 VBA 和 OLEDB 在 excel 中创建表格

  11. 11

    Oledb和DATETIME的问题

  12. 12

    Oledb和DATETIME的问题

  13. 13

    ACE OLEDB连接到Access Runtime 2016

  14. 14

    OleDb与Access数据库的连接

  15. 15

    数据导出到MS ACCESS时,未在本地计算机上注册“ Microsoft.ACE.OLEDB.12.0”提供程序

  16. 16

    MS Access 2013何时打开和关闭odbc连接?

  17. 17

    MS Access VBA,SQL脚本:In(),<>和AND语法

  18. 18

    MS Access VBA IF()

  19. 19

    通过SQL或OLEDB找出Access表的哪些列是自动递增的?

  20. 20

    OLEDB-无法在Access数据库中编辑记录

  21. 21

    VBA中的MS Access 2003刷新链接的ODBC表导致膨胀

  22. 22

    VBA中的MS Access 2003刷新链接的ODBC表导致膨胀

  23. 23

    MS Access-VBA-创建新的Excel工作簿

  24. 24

    C#TransactionScope与OleDB和Oracle

  25. 25

    在Access中使用ODBC连接到MS SQL Server 2012:手动调用查询和在VBA中之间存在巨大的时差

  26. 26

    在Access中使用ODBC连接到MS SQL Server 2012:手动调用查询和在VBA中之间存在巨大的时差

  27. 27

    MS Access数据库和MySql之间同步

  28. 28

    在两个日期之间选择 MS Access 和 php

  29. 29

    连接到ODBC时的MS Access错误

热门标签

归档