将数据帧写入 R 中的现有 Access (.accdb) 表

Write a data frame to an existing Access (.accdb) table in R

提问人:SuavestArt 提问时间:8/30/2023 最后编辑:Gord ThompsonSuavestArt 更新时间:8/31/2023 访问量:50

问:

我花了一些时间使用该库将数据帧写入 Access 表,但在意识到它禁止列名中的空格后放弃了它。RDBOC

现在我正在尝试这个库,我在网上找到的参考资料较少。dboc

通过编写以下命令创建与数据库的连接:

con <- dbConnect(odbc(), .connection_string = paste("Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=", my_db_path, sep = ""))

之后,我尝试了两种将数据框写入表的替代方法:

dbWriteTable(con, "existing_table", my_df, append = TRUE)
dbWriteTable(con, "existing_table", my_df, overwrite = TRUE)

两者都返回了以下错误。数据框中的列名与表中的列名匹配。

Error: nanodbc/nanodbc.cpp:1763: HYC00: [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented

有关如何调试此错误的任何指导?

R MS-Access ODBC RODBC

评论

1赞 Gord Thompson 8/31/2023
rodbc 可能正在尝试将整数值作为 BIGINT 发送,而 Access ODBC 不支持该值。若要检查这一点,请启用 ODBC 跟踪并运行(失败的)代码。再次关闭 ODBC 跟踪,然后打开 SQL。LOG 文件并搜索 .如果你找到它,那么检查 rodbc 文档,看看你是否可以告诉它以 SQL_INTEGER 而不是SQL_BIGINT的形式发送整数。SQL_BIGINT

答:

2赞 Erik A 8/31/2023 #1

DBI默认情况下,带有批处理插入。Access 不支持批量插入。这是未实现的可选功能。odbc

要执行正常插入,请指定:batch_rows = 1

dbWriteTable(con, "existing_table", my_df, append = TRUE, batch_rows = 1)

GitHub 上也进行了讨论。

关于调试,正如 Gord Thompson 所指出的,ODBC 跟踪通常是一个不错的选择,但这是一个已知问题。

评论

0赞 SuavestArt 8/31/2023
它有效,谢谢,但它太慢了。我什至尝试在桌面上而不是在网络上写入 Access 文件,但这并没有提高速度。有什么猜测吗?
1赞 Erik A 8/31/2023
井。。。访问速度不是那么快。细节实际上取决于您要插入的内容。最好先将数据写入 Excel,然后再将数据从 Excel 导入 Access。查看 stackoverflow.com/a/70977554/7296893