1

我正在使用 pandas 数据框的 to_sql 函数将记录保存到 MS Access 97 MDB。但我收到以下错误:

pyodbc.Error: ('HY104', '[HY104] [Microsoft][ODBC Microsoft Access Driver]Invalid 
precision value  (98) (SQLBindParameter)').

我在 Windows 10 工作站上使用 Python 3.8.5 32 位。

我还安装了以下库。

datacompy==0.7.1
et-xmlfile==1.0.1
jdcal==1.4.1
numpy==1.19.2
openpyxl==3.0.5
pandas==1.1.2
pyodbc==4.0.30
python-dateutil==2.8.1
pytz==2020.1
pywin32==228
six==1.15.0
SQLAlchemy==1.3.19
sqlalchemy-access==1.0.7

提前致谢!

4

1 回答 1

1

在使用 Access_97 数据库文件时,您遇到了 Access ODBC 驱动程序的限制。在 Python_3 中,所有字符串都是 Unicode,但 Access 直到 Access_2000 才开始支持 Unicode。

此代码因您描述的错误而失败

num_characters = 128
df = pd.DataFrame(
    [
        (
            1,
            "x" * num_characters,
        )
    ],
    columns=["ID", "TextField"],
)
df.to_sql("sa_a_test", engine, index=False, if_exists="append")

num_characters使用 Access_97 (Jet 3.5) .mdb 文件时大于 127的值。使用 Access_2000 (Jet 4.0) .mdb 文件时,相同的代码不会失败。

作为一种解决方法,您也许可以使用这样的东西

cnxn = engine.raw_connection()
crsr = cnxn.cursor()
sql = "INSERT INTO [sa_a_test] ([ID],[TextField]) VALUES (?,?)"
crsr.setinputsizes([(pyodbc.SQL_INTEGER,), (pyodbc.SQL_LONGVARCHAR,)])
crsr.executemany(sql, df.itertuples(index=False))
cnxn.commit()

但更好的解决方案是将数据库文件升级到更新版本。Access_97 文件格式已被弃用多年,现在完全不受Microsoft 支持。

于 2020-10-03T16:42:23.310 回答