如何使用C API使用SQLite3 import命令?

时间:2009-10-26 18:44:40

标签: iphone c objective-c sqlite

我有以下代码:

int rc;
rc = sqlite3_exec(sqlite3_database, ".import mydata.csv mytable", callback, 0, &errMsg);

运行此命令后,errMsg包含以下错误消息:

near ".": syntax error

我认为它无法识别导入命令。但是,在命令行上从sqlite3程序运行它时,此命令有效。

我需要能够直接在我的程序中使用import命令。有没有办法可以做到这一点?我需要使用import命令的原因是因为为CSV文件的每一行执行插入操作需要5分钟,而import命令需要一瞬间。

4 个答案:

答案 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_resetsqlite3_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相同的性能,我相信。