【问题标题】:How to read from a 32 bit .mdb with 64 bit python and odbc driver如何使用 64 位 python 和 odbc 驱动程序从 32 位 .mdb 读取
【发布时间】:2018-07-10 09:44:18
【问题描述】:

大家好,

我正在寻找 32 位 .mdb 与我的 64 位环境冲突的解决方案:64 位 Windows 7,带有运行 64 位 python 的 64 位 MS Access 数据库驱动程序。我想将这些 .mdb 中的数据写入 64 位 PostgreSQL 数据库,也可能写入 .csv 文件。但是,我希望这个工具不仅可以在我的机器上工作,而且还可以在同事的机器上工作,因此理想情况下它也能够处理其他环境。

最初,我有一个使用 32 位版本的 MS Access 数据库驱动程序和 python 写入 .csv 的脚本。但是,我想创建一个 QGIS 插件,我也有 64 位,我不想为了能够读取偶尔的 32 位 .mdb 文件而将所有内容都更改为 32 位。

我对编码完全陌生,但我已经阅读了这个问题并了解在 32 位数据库和 64 位脚本和驱动程序之间建立直接连接基本上是不可能的。尽管如此,我仍然很难相信这个问题没有解决方案。 Web 应用程序不经常处理这些情况吗?例如,是否可以使用 Django 创建这种功能?还是使用声称支持 32 位和 64 位的昂贵驱动程序是一种解决方案?创建独立工具会更容易吗?还是我还没有找到的这种工具已经存在?

总结一下:我希望将数据从 32 位 .mdb 写入 64 位 PostgreSQL 数据库,最好在 QGIS 插件中编码。

我之前工作的初始代码是:

import csv, pyodbc
from tkinter import Tk
from tkinter.filedialog import askopenfilename

Tk().withdraw()
filename = askopenfilename()filenameEdit = filename.replace(":/", "://")

print(filename)
print(filenameEdit)

MDB = filename
DRV = '{Microsoft Access Driver (*.mdb, *.accdb)}'
DBQ = filename
PWD = 'pw'

con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD))
cur = con.cursor()

SQL = 'SELECT * FROM strips'  # This query would need to be expanded
rows = cur.execute(SQL).fetchall()
cur.close()
con.close()

mytable = input("Save file as: ")

def writeCSV():
    with open((mytable+'.csv'), 'w') as newDB:
        csv_writer = csv.writer(newDB, lineterminator='\n')
        for row in rows:
            csv_writer.writerow(row)

writeCSV()

# Another function should be added to write to a PostreSQL database

现在运行 64 位时出现的错误是:

con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD))

pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x2820 Thread 0x2758 DBC 0x65626f8
Jet'. (63) (SQLDriverConnect); [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x2820 Thread 0x2758 DBC 0x65626f8
Jet'. (63); [HY000] [Microsoft][ODBC Microsoft Access Driver] Cannot open a database created with a previous version of your application. (-1019); [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x2820 Thread 0x2758 DBC 0x65626f8
Jet'. (63); [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x2820 Thread 0x2758 DBC 0x65626f8
Jet'. (63); [HY000] [Microsoft][ODBC Microsoft Access Driver] Cannot open a database created with a previous version of your application. (-1019)")`

任何想法将不胜感激, 非常感谢!

【问题讨论】:

  • mdb 不是 32 位或 64 位的。它们只是文件。但是,您确实需要适当的驱动程序,并且在同一台机器上安装 32 位和 64 位驱动程序往往会导致问题。尝试从通过 64 位 ODBC 数据源管理员创建 DSN 开始,这样更容易排除故障。
  • 您好,Erik,非常感谢您的快速回复。 ODBC 数据源管理员中的用户 DSN 是“MS Access 数据库”。驱动程序:Microsoft Access 驱动程序(*.mdb、*.accdb)。我尝试将完整目录输入到 mdb 文件中,但我得到了同样的错误。 mdb 文件的名称会定期更改,用户应该能够在不同的机器上使用该工具。我已尝试指定用户 DSN,但收到此错误:
  • con = pyodbc.connect('DSN = MS Access Database') pyodbc.InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no指定的默认驱动程序 (0) (SQLDriverConnect)')
  • @HCPieck 尝试指定文件名:con = pyodbc.connect('DSN=MS Access Database;DBQ={}'.format(DBQ))
  • 感谢 Parfait,但仍然是同样的问题:未找到 DSN 且未指定默认驱动程序..

标签: python postgresql csv ms-access 32bit-64bit


【解决方案1】:

Access 数据库文件(.mdb、.accdb)不是特定于体系结构的;没有“32 位 .mdb 文件”或“64 位 .accdb 文件”之类的东西。 Access 数据库引擎(和驱动程序等)有 32 位和 64 位版本,但它们生成的数据库文件是相同的。

你收到了

无法打开使用以前版本的应用程序创建的数据库。

错误,因为您的 Access 数据库引擎版本不再支持您尝试使用的数据库文件的版本(不是“位”)。如果您使用 Access_2013 或更高版本的 Access 数据库引擎,则您的文件格式必须为 Access_97 或更早版本。如果您使用的是 Access_2010 中的 Access 数据库引擎,那么您尝试使用的文件格式是超旧的(可能是 Access_2.0)。

您似乎已经注意到,我们仍然可以使用 Windows 附带的旧版“Jet”数据库引擎 (Microsoft Access Driver (*.mdb)) 处理较旧的数据库文件,但它是 32 位驱动程序,没有 64 位驱动程序版本。

【讨论】:

  • 您好 Gord Thompson,感谢您的回答,现在才阅读。好像你确实指出了这个问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多