再次欢迎社区,
我正在寻找32位.mdb与我的64位环境冲突的解决方案:64位Windows 7,64位MS Access数据库驱动程序运行64位python。我想将这些.mdb中的数据写入64位PostgreSQL数据库,也可能写入.csv文件。但是,我希望这个工具不仅适用于我的机器,也适用于同事,因此理想情况下它也可以处理其他环境。
最初我有一个脚本写入.csv与32位版本的MS Access数据库驱动程序和python。但是,我想创建一个Q64插件,我也有64位,我不想把所有东西都改成32位只是为了能够读取偶尔的32位.mdb文件。
我对编码完全不熟悉,但我已经阅读了这个问题并理解它基本上不可能在32位数据库和64位脚本和驱动程序之间建立直接连接。不过,我发现很难相信这个问题没有解决办法。网络应用程序不经常处理这种情况吗?例如,可以使用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)")`
非常感谢任何想法, 非常感谢!
答案 0 :(得分:0)
Access数据库文件(.mdb,.accdb)不是特定于体系结构的;没有“ 32位.mdb文件”或“ 64位.accdb文件”之类的东西。访问数据库 Engine (和驱动程序等)有32位和64位版本,但是它们生成的数据库文件是相同的。
您正在收到
无法打开使用先前版本的应用程序创建的数据库。
错误,因为您的Access数据库引擎版本不再支持您要使用的数据库文件的版本(不是“位”)。如果您将Access数据库引擎用于Access_2013或更高版本,则文件格式必须为Access_97或更低版本。如果您使用的是Access_2010中的Access数据库引擎,则您尝试使用的文件的格式是超旧的(可能是Access_2.0)。
您似乎已经注意到,我们仍然可以使用Windows附带的旧版“ Jet”数据库引擎(Microsoft Access Driver (*.mdb)
)来处理较旧的数据库文件,但它是32位驱动程序,没有64位驱动程序位版本。