Pyodbc 报错 Data source name not found and no default driver specified paradox

Pyodbc error Data source name not found and no default driver specified paradox

我正在尝试使用 pyobdc 从 paradox 数据库中读取数据,但在尝试连接到数据库时我不断收到以下错误:

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

我已尝试为数据库创建新的 DNS 链接,但始终无济于事。

我的系统链接如下:

我的代码是:

import os
import sys
import time
import pyodbc

LOCATION = "c:\Users\Marcello\Desktop\DATA\ScorMonitor.db"

cnxn = pyodbc.connect(r"Driver={{Microsoft Paradox Driver (*.db )}};Fil=Paradox 5.X;DefaultDir={0};Dbq={0}; CollatingSequence=ASCII;")
cursor = cnxn.cursor()
cursor.execute("select last, first from test")
row = cursor.fetchone()
print row

关于检查内容的两个想法:

1) 您的连接字符串错误。有一种方法可以直接从 ODBC Administrator 程序(取自 http://www.visokio.com/kb/db/dsn-less-odbc)获取已知的良好连接字符串。这些说明假定您使用的是 MDB,但同样的过程也适用于悖论文件

  • 在典型的客户端 PC 上,打开控制面板 -> 管理工具 -> 数据源。
  • Select“文件 DSN”选项卡并单击“添加”。
  • Select 适当的驱动程序(例如 "Microsoft Access Driver (*.mdb)")并单击下一步
  • 单击“浏览”并选择要保存 .dsn 文件的位置(这是您稍后要删除的临时文件)。
  • 单击“下一步”,然后单击“完成”。
  • 您将看到供应商特定的 ODBC 设置对话框。例如,对于 Microsoft Access,您可能只需要单击 Select 并浏览到现有的 .mdb 文件,然后单击“确定”。
  • 浏览到 .dsn 文件的位置并使用记事本打开。

在 DSN 文件中,您可能会看到类似于以下内容的内容:

[ODBC]
DRIVER=Microsoft Access Driver (*.mdb)
UID=admin
UserCommitSync=Yes
Threads=3
SafeTransactions=0
PageTimeout=5
MaxScanRows=8
MaxBufferSize=2048
FIL=MS Access
DriverId=25
DefaultDir=C:\
DBQ=C:\db1.mdb

将上面的转换为完整的连接字符串:

  1. 省略第一个 [ODBC] 行
  2. 将所有包含空格的值放在花括号中
  3. 将所有名称=值对放在一行中,用分号分隔。

这为您提供了完整的连接字符串。在此示例中,字符串变为:

DRIVER={Microsoft Access Driver (*.mdb)};UID=admin;UserCommitSync=Yes;Threads=3;SafeTransactions=0;PageTimeout=5;axScanRows=8;MaxBufferSize=2048;FIL={MS Access};DriverId=25;DefaultDir=C:\;DBQ=C:\db1.mdb

2) 32/64 位不匹配。我在将 32 位 python 与 64 位驱动程序混合使用时遇到了麻烦,反之亦然。您可能需要检查您的 Python 解释器和数据库驱动程序队列。

感谢您提出问题,我遇到了类似的问题,这个问题和答案帮助我找到了我需要的东西。 我的问题最终是 Windows 10 上的 64 位 Python 和 32 位 ODBC 驱动程序不匹配(正如查德·肯尼迪所建议的那样)。我是 运行 完全更新的 Fall Creator's Edition,并且安装了 Microsoft Office Pro 2016。 MS Office 安装程序仍然默认为 32 位安装(不要让我开始......) - 它在安装时不会询问这个问题,所以想象一下当我发现我是 运行 时我的惊讶32 位办公室。因此,它会为 MS Access 安装 32 位 ODBC 驱动程序。有一个微小的不明显 link 您可以在 MS Office 安装程序对话框中单击以强制安装 64 位。

64 位 Python 安装不适用于 32 位 Microsoft Access ODBC 驱动程序,如果您有 32 位 MS,Microsoft 不会让您安装 64 位 ODBC 驱动程序机器上安装了Office。

解决方法是卸载 MS Office,re-install 通过在安装对话框中使用那个微小的 link 告诉它安装为 64 位。别担心,它会记住您最近的所有文件和设置,以及 Outlook 中的电子邮件帐户。一旦完成,我就有了 64 位 ODBC 驱动程序,并且我的 Python 代码连接到数据库没有进一步的问题。

设置ODBC数据源的快捷方式可能指向32位数据源而不是64位。

转到控制面板 -> 管理工具 --> select 数据源 (ODBC) --> 然后右键单击该文件 --> 转到属性 --> 在快捷方式选项卡中 ->将路径从 %windir%\System32\odbcad32.exe 更改为

%windir%\SysWOW64\odbcad32.exe

您需要一个与您的 Python 安装兼容的 Microsoft Office 版本,即它们都必须是 32 位或 64 位。 来自 pyodbc 文档:

There are actually two (2) different Access ODBC drivers from Microsoft:

  1. Microsoft Access Driver (*.mdb) - This is the older 32-bit "Jet" ODBC driver. It is included as a standard part of a Windows install. It only works with .mdb (not .accdb) files. It is also officially deprecated.

  2. Microsoft Access Driver (*.mdb, *.accdb) - This is the newer "ACE" ODBC driver. It is not included with Windows, but it is normally included as part of a Microsoft Office install. It is also available as a free stand-alone "redistributable" installer for machines without Microsoft Office. There are separate 64-bit and 32-bit versions of the "ACE" Access Database Engine (and drivers), and normally one has either the 64-bit version or the 32-bit version installed. (It is possible to force both versions to exist on the same machine but it is not recommended as it can "break" Office installations. Therefore, if you already have Microsoft Office it is highly recommended that you use a Python environment that matches the "bitness" of the Office install.)

The easiest way to check if one of the Microsoft Access ODBC drivers is available to your Python environment (on Windows) is to do

>>> import pyodbc
>>> [x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')]

If you see an empty list then you are running 64-bit Python and you need to install the 64-bit version of the "ACE" driver. If you only see ['Microsoft Access Driver (*.mdb)'] and you need to work with an .accdb file then you need to install the 32-bit version of the "ACE" driver.