即使它在 pyodbc.dataSources() 中列出,也找不到驱动程序

Posted

技术标签:

【中文标题】即使它在 pyodbc.dataSources() 中列出,也找不到驱动程序【英文标题】:Driver not found even though it's listed in pyodbc.dataSources() 【发布时间】:2017-01-11 12:42:38 【问题描述】:

我尝试使用 pyodbc 访问 MS Access .mdb 数据库。我已经设置了 ODBC 驱动程序,驱动程序已经注册到我的 DSN 中,我可以在pyodbc.dataSources()找到。

​sources = pyodbc.dataSources()
dsns = list(sources.keys())
dsns.sort()
sl = []
for dsn in dsns:
    sl.append('%s [%s]' % (dsn, sources[dsn]))
print('\n'.join(sl))

结果:

Excel Files [Microsoft Excel Driver (*.xls)]
MS Access DB [Microsoft Access Driver (*.mdb, *.accdb)]
MS Access Database [Microsoft Access Driver (*.mdb)]
dBASE Files [Microsoft dBase Driver (*.dbf)]

所以,我尝试使用以下命令访问数据库:

con = pyodbc.connect(r'DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=H:\access-panda\data\myDB.mdb;')

但是,我不断收到此错误:

Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')

我已尝试解决此问题.. 但没有运气。我错过了什么吗?

【问题讨论】:

【参考方案1】:

pyodbc.dataSources() 生成的列表具有误导性,因为它显示了 32 位和 64 位“平台”的结果。在具有 32 位 Office 的机器上,在 64 位 Python 下运行您的代码将生成列表

Excel Files [Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)]
MS Access Database [Microsoft Access Driver (*.mdb, *.accdb)]

但如果我们打开 64 位 ODBC 管理器,我们会看到它们都是用于 32 位“平台”的

并且相关的驱动程序将可用于在 64 位 Python 下运行的 pyodbc。

获取可用驱动程序列表的更可靠方法是使用

drivers = pyodbc.drivers()
print(drivers)

这应该只显示可用于您的特定“平台”(即 64 位或 32 位 Python)的驱动程序。

【讨论】:

是的,我的 python 和 pyodbc 是 64 位的……我已经更新了 sysWOW64 中的 ODBC 驱动程序……但问题还没有解决。最后,我将 python 和 pyodbc 都降级为 32 位。有没有办法设置 pyodbc-64 位来引用正确的驱动程序? @SaberAlex - 64 位 Python/pyodbc 只能与 64 位驱动程序一起使用。如果安装了 32 位 Office,则 Python 应用程序必须以 32 位运行才能使用 32 位 Access ODBC 驱动程序。 似乎我的 pyodbc-64 位一直在引用 32 位驱动程序 @SaberAlex - 当您在 64 位 Python 下运行脚本时,您的意思是 pyodbc.drivers() 正在显示“Microsoft Access Driver ...”吗?

以上是关于即使它在 pyodbc.dataSources() 中列出,也找不到驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 配置错误,即使它在 AppDelegate.swift 中被调用

SyntaxError:“等待”外部函数,即使它在异步内部

JavaFX“需要位置”。即使它在同一个包中

Rider “未找到 Android Sdk”,即使它在那里

导入时出现pycharm错误,即使它在终端中工作

即使它在 Postman Api 测试中通过,我如何打印带有值的断言