【问题标题】:Pyodbc error Data source name not found and no default driver specified paradoxPyodbc 错误数据源名称未找到且未指定默认驱动程序悖论
【发布时间】:2015-09-18 22:46:31
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 我不知道你是否已经看过这个,但这篇文章有一个悖论驱动程序的连接字符串。也许你可以试试这个,看看它是否有助于解决?它看起来与您的相似,但存在一些差异。 stackoverflow.com/questions/13651087/…
  • 是的,我遵循了该帖子中建议的所有步骤,但并没有解决问题
  • 您的机器上是否安装了 Borland 数据库引擎(或更现代的兼容版本)?
  • @GordThompson 不,我没有
  • @GordThompson 我有 BDE 管理员

标签: python windows python-2.7 pyodbc


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。但我想知道在哪里可以找到这样的 DNS。我对必须使用驱动程序作为数据库访问非常陌生。
  • 您不必查找 DSN 文件。我描述的过程将生成一个 DSN 文件。如上所述,您可以从那里获得完整的连接字符串。您唯一需要做的就是选择正确的驱动程序并选择正确的文件,这两者似乎您已经知道了。
  • 谢谢你现在更有意义了。应用我从你的帖子中学到的东西给了我这个错误:KeyError: 'Microsoft Paradox Driver (*'我非常抱歉,但这对我来说是一个非常新的领域。
  • 嗯.. 你记得添加花括号吗?像这样: DRIVER={Microsoft Access Driver (*.mdb)} 如果不是这样,您可能想开始一个新问题,在问题中给出完整的连接字符串,以及上下文所需的前后代码.
  • 谢谢。 32/64 位不匹配是我的问题。
【解决方案2】:

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

实际上有两 (2) 个来自 Microsoft 的不同 Access ODBC 驱动程序:

  1. Microsoft Access Driver (*.mdb) - 这是较旧的 32 位“Jet”ODBC 驱动程序。它作为 Windows 安装的标准部分包含在内。它仅适用于.mdb(不是.accdb)文件。它也被正式弃用。

  2. Microsoft Access Driver (*.mdb, *.accdb) - 这是较新的“ACE”ODBC 驱动程序。它不包含在 Windows 中,但通常包含在 Microsoft Office 安装中。它还可以作为免费的独立“可再发行”installer 用于没有 Microsoft Office 的机器。有单独的 64 位和 32 位版本的“ACE”Access 数据库引擎(和驱动程序),通常有一个要么 64 位版本已安装 32 位版本。 (可以强制两个版本存在于同一台计算机上,但不建议这样做,因为它会“破坏”Office 安装。因此,如果您已经拥有 Microsoft Office,强烈建议使用与 Office 安装的“位数”相匹配的 Python 环境。)

检查 Microsoft Access ODBC 驱动程序之一是否可用于您的 Python 环境(在 Windows 上)的最简单方法是:

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

如果您看到一个空列表,则说明您运行的是 64 位 Python,您需要安装 64 位版本的“ACE”驱动程序。如果您只看到 ['Microsoft Access Driver (*.mdb)'] 并且您需要使用 .accdb 文件,那么您需要安装 32 位版本的“ACE”驱动程序。

【讨论】:

  • 问题是关于读取 Paradox 文件,而不是 MS Access 数据库。但是谢谢你的建议,因为它帮助了我。
  • 简单列出所有 pyodbc.drivers() 提示我使用驱动程序版本 17 而不是 13
【解决方案3】:

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

64 位 Python 安装不适用于 32 位 Microsoft Access ODBC 驱动程序,如果您在计算机上安装了 32 位 MS Office,Microsoft 将不允许您安装 64 位 ODBC 驱动程序。

修复方法是卸载 MS Office,然后使用安装对话框上的那个小链接重新安装它,告诉它安装为 64 位。不用担心,它会记住您最近的所有文件和设置,以及 Outlook 中的电子邮件帐户。完成后,我就有了 64 位 ODBC 驱动程序,并且我的 Python 代码连接到了数据库,没有其他问题了。

【讨论】:

  • 即使我全部都是 64 位但它不起作用,我必须全部更改为 32 位才能使其工作
【解决方案4】:

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

转到控制面板->管理工具->选择数据源(ODBC)->然后右键单击该文件->转到属性->在快捷方式选项卡中->从@987654321更改路径@到

%windir%\SysWOW64\odbcad32.exe

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2016-09-06
    • 2016-07-08
    相关资源
    最近更新 更多