我有以下代码:
int rc;
rc = sqlite3_exec(sqlite3_database, ".import mydata.csv mytable", callback, 0, &errMsg);
运行此命令后,errMsg包含以下错误消息:
near ".": syntax error
我认为它无法识别导入命令。但是,在命令行上从sqlite3程序运行它时,此命令有效。
我需要能够直接在我的程序中使用import命令。有没有办法可以做到这一点?我需要使用import命令的原因是因为为CSV文件的每一行执行插入操作需要5分钟,而import命令需要一瞬间。
答案 0 :(得分:8)
命令行shell的.import
不是C API的一部分; sqlite3
工具将其实现为
sqlite3_prepare(..., "INSERT INTO '...' VALUES (?, ..., ?)", ...);
sqlite3_exec(..., "BEGIN", ...);
for (each entry) {
for (each column) sqlite3_bind_text(..., column, ...);
sqlite3_step(...);
}
sqlite3_exec(..., "COMMIT", ...);
进行一些错误检查(ROLLBACK
,如果出现任何问题)并处理准备好的语句(sqlite3_reset
,sqlite3_finalize
)。
答案 1 :(得分:3)
作为一个相当古老的帖子,我只想更新以供参考。
我正在为SQLite3 C / C ++ API导入/导出功能维护一个开源API。可以通过this link
访问代码答案 2 :(得分:2)
.import是命令行程序界面的一部分,而不是我认为的C API。您可以(正如我所做的那样)使用其他工具在SQLite3数据库文件中设置所有数据,然后在您的应用中包含该数据库文件。然后,当您在代码中打开它时,数据已经存在。
答案 3 :(得分:1)
我怀疑插件花了这么长时间,因为你让SQLite为每一行重新分析你的INSERT语句(即使用sqlite3_exec()),而不是使用参数化的预准备语句(即使用{{3 },sqlite3_prepare_v2()和sqlite_bind_*())。正如上面提到的那样,这就是内部实施导入的方式。
使用参数化语句应该达到与.import相同的性能,我相信。