- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
其他更高级的程序员:
如果这看起来像是令人厌倦的 Python 32 位/64 位 ODBC/OLEDB Windows 问题,请原谅我,但我尝试搜索论坛但无法完全找到我的问题的原因。
基本上,我尝试首先使用 pypyodbc 模块通过 ODBC 连接一个非常简单的 Python 脚本,然后使用 adodbapi 模块通过 OLEDB 连接一个非常简单的 Python 脚本,两者都尝试连接到 MS Access 2010 .accdb 数据库。但是,对于 OLEDB,我始终得到 'Provider not found。它可能没有正确安装' 错误。对于 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 的 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
以下是我的连接字符串,它返回“未找到数据源名称...”:
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)
Access 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 对比 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 模块库的技术,Microsoft 不允许同时使用 x32 位和 x64 位组件,但为什么我不能得到我想要的结果。我想到了 AccessDatabaseEngine_x64.exe/passive,但我听到奇怪的 Office 结果走这条路。我需要为 64 位安装 Python3.4 吗?请帮助或建议!谢谢。
最佳答案
简答:
是的,如果您安装了 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,因此您拥有更新的“ACE”驱动程序的 64 位版本......
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 驱动程序。
关于python - Python 和 MS Access VBA 之间 OLEDB/ODBC 的相反工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25951912/
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想从输入对象内部开始找到下一个表单元素。Find() 是查找子对象的绝佳函数。但是在父级中寻找相反的方法呢?
是否可以执行$(this)的相反操作? 因此,它不是获取 this 元素,而是获取与 .sb-popular-thumb a 匹配但不包括 $(this) 的所有内容? 请参阅下面的示例代码。我已用
这是一个关于术语的问题。 考虑到有一个方法使用词法this: var foo = { method: function () { console.log(this, ' is the co
我想问你是否存在一个与 WHERE IN 相反的命令,我想选择数组中具有不同参数的所有行。 1 && id <> 2 && id <> 3"; // how can i do the same q
是否有语法来获取不在给定切片内的列表元素?给定切片 [1:4] 很容易得到这些元素: >>> l = [1,2,3,4,5] >>> l[1:4] [2, 3, 4] 如果我想要列表的其余部分,我可以
这个问题在这里已经有了答案: How can I remove a specific item from an array? (138 个回答) 关闭8年前。 JavaScript push(); 方
在此先感谢您的帮助。这是一个很棒的社区,我在这里找到了许多编程答案。 我有一个包含多个列的表,其中5个包含日期或null。 我想编写一个本质上将5列合并为1列的sql查询,条件是如果5列中的1包含“N
我使用 hasClass() 在 if 语句中验证元素是否具有给定的类。 如果元素没有给定的类,如何检查 if 语句?预先感谢您的回复。 最佳答案 为什么不简单地: if (!el.hasClass(
我有一个 std::vector v我想防止进一步写入它。 C++ 编译器不接受这个 const std::vector& w = v; 但它接受这个 const std::vector& w = r
这个问题已经有答案了: How to reshape data from long to wide format (14 个回答) 已关闭 7 年前。 我有像这样的巨大数据框: SN = c(1:10
如何将可调用(匿名函数)转换为字符串进行评估? 我正在尝试在 phpunit 中编写使用 runkit 的单元测试覆盖方法。特别是,runkit_method_redefine() 需要一个字符串参数
我想实现一个堆栈(队列),许多用户可以以 FILO 方式将其推送(),并且许多用户可以从中弹出()。 是否有与 pop() 等效的方法来检索/删除列表的最后一项? 例如: var popRef = f
我想知道“无状态协议(protocol)”的反面是什么。例如,鉴于 HTTP 是无状态的,那么像 FTP 这样的协议(protocol)是相反的/维护状态的协议(protocol),我的假设是否正确?
我对array_filter很熟悉,想往功能上想,但我想知道有没有办法保留被丢弃的值?例如,如果我有一个像这样的数组: 2; }); 结果将是:array( 3, 4 )。 有没有办法保留丢弃的值
我已将色轮的图像加载到 Canvas 上,并且在数组中有一个色相值列表。我遍历 Canvas 上的每个像素,并删除匹配相同色相值的像素。 该代码是: var element = document.ge
这个问题在这里已经有了答案: Repeat each row of data.frame the number of times specified in a column (10 个答案) 关闭
如何将可调用(匿名函数)转换为字符串以进行评估? 我正在尝试在使用 runkit 的 phpunit 中编写单元测试覆盖方法。特别是,runkit_method_redefine() 需要一个字符串参
我对array_filter很熟悉,想往功能上想,但我想知道有没有办法保留被丢弃的值?例如,如果我有一个像这样的数组: 2; }); 结果将是:array( 3, 4 )。 有没有办法保留丢弃的值
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!