2011-02-23 215 views
1

我想插入大量的记录到SQLite数据库。如果我尝试使用sqlite3_exec C-API,会出现上述错误。SQLite查询语法错误

的代码看起来是这样的:

ret = sqlite_exec(db_p,".import file.txt table", NULL, NULL, NULL); 

我知道.IMPORT是命令行,但是能有什么办法,你可以做一个非常大的插入是需要最少的时间记录。我已经通读过以前的批量插入代码并试图进行更改,但这些都没有提供所需的结果。

是否没有一种方法可以直接将字符串插入到表中而不需要调用中间API?

+1

您可以添加一段代码生成SQL并调用sqlite3_exec吗?此错误通常是由语法错误或格式错误引起的。 – 2011-02-23 12:36:15

+0

ret = sqlite_exec(db_p,“。import file.txt table”,NULL,NULL,NULL); – SportyMe 2011-02-23 12:40:21

回答

0

语法错误的答案很可能是,您的字符串未包含在SQL语句中的引号中。

+0

必须有一种方法来使用C API函数中的命令行等效项?我已经发布了如上所述报告错误的代码片断。 – SportyMe 2011-02-23 12:42:22

3

.import很可能无法通过API获得。然而,加速插入有一个重要的事情:将它们包装在一个事务中。

BEGIN; 
lots of insert statements here; 
COMMIT; 

没有这个,sqlite将需要在每次插入后写入文件以保持ACID原则。事务让它稍后批量写入文件。

+0

这是正确的答案。 SQLite是一个库。 '.import'和其他点命令是SQLite shell的一部分,它只是一个基于SQLite的示例程序(尽管是官方的)。但是你应该在'BEGIN'和'COMMIT'之后加分号。 – Benoit 2011-02-23 12:45:08

+0

我是否需要在每个事务之间为每个事务处理sqlite3_exec,以便在此处执行单独的插入操作?谢谢:-) – SportyMe 2011-02-23 12:58:39

+0

@SportyMe:查看shell实用程序的源代码(http://www.sqlite.org/src/annotate?checkin=f85afa0ecc7b31d3&filename=src/shell.c)。搜索'“import”'包括引号。他们使用'BEGIN/END'创建一个事务,为INSERT调用''sql3_bind_text''准备语句,每行调用'sql3_step'。代码很可读。 – 2011-02-24 01:19:50