3

我的一个 Python 应用程序在使用旧的 .mdb 访问数据库时运行良好,我遇到了问题。转换为 Access 2010 并将文件转换为新的 .accdb 格式后,似乎没有任何效果。我确实在新的 64 位 Win 7 操作系统上加载了 32 位 Access 版本。我相信我的问题在于我的代码的前两行。我相信我需要更新它们以引用“Microsoft Office 14.0 Access Database Engine Object”,但我不清楚如何执行此操作。我可以得到一些帮助吗?我已经搜索了有关这种情况的 DAO 信息的高低,但都可以利用。

 import win32com.client
 engine = win32com.client.Dispatch("DAO.DBEngine.36")

 db=engine.OpenDatabase(r"c:\temp\Tracker.accdb")

 table = db.OpenRecordset("select * from Event_Log")
 print table.RecordCount
4

1 回答 1

4

对于 OP 来说答案可能为时已晚,但万一其他人在这里偶然发现使用 Python 在 DAO 领域寻找答案:

OP 是正确的,直接的问题在于 Dispatch 方法中使用的字符串。Office 2010(Office 14?)安装“DAO.DBEngine.120”,我认为这是与 .accdb 文件一起使用的最早版本。通常,可以通过使用 RegEdit 在注册表中搜索子字符串“DAO.DBEngine”来研究此问题,并查看哪些组件已注册,将版本号添加到该字符串。

还需要注意的是,要使用的python版本的32/64位需要与DAO版本的32/64位匹配,而DAO版本又与安装它的Office的32/64位匹配。

进一步说明:如果您使用 IDE 并使用自动完成功能,则生成和导入与 DAO API 对应的模块很有用。这可以通过在相关库(此处为“Microsoft Office 14.0 Access Database Engine Object Library”)上运行 MakePy 实用程序(在 PythonWin 程序中)来完成。这会在 site-packages\win32com\gen_py\ 中生成一个模块文件,其 GUID 名称很长……您可以将其重命名为“DAO_120-64.py”或类似名称。然后将 gen_py 目录添加到 Python 路径中(或在 sitepackages 中添加一个 .pth 文件),以便 import 可以找到新模块。

导入后,您可以执行 IDE 识别的任何操作,将类型与 DAO.Database、DAO.Recordset 等的变量相关联。

此外,生成的 DAO 模块是可用的对象、方法、属性和常量的有用参考。可能更有用的参考是简单地打开一个 Excel/Word/Access VBA 项目,参考(导入)这个相同的库,然后在其上使用 VBA 对象浏览器。

一般来说,任何关于在Access(VBA或VB)中使用DAO的教程或文章都会描述常见操作中涉及的对象、方法和属性,几乎可以逐字转录成python。主要区别在于,在 python 版本中,一些 COM“默认方法”机制不起作用。因此,例如,VBA

MyRecordset("SomeColumn") = "NewValue"

...在python中对应于:

MyRecordset.Fields("SomeColumn").Value = "NewValue"

希望有帮助。

于 2016-07-11T10:43:58.653 回答