为了加快表插入速度,我将insert语句(全部终止为分词)连接到一个字符串(sqlCode)中,即PREPAREd然后STEPed。
我的测试文件中有10000条记录,但表中只有1000个插入的记录。
我做错了什么?
我知道我应该将参数绑定到insert语句,但是对于这一点还是新手,接下来我将学习绑定参数。此外,返回值(0)重置其他地方使用的计数器。
谢谢。
弗兰克。
int loadBloc( sqlite3 *db, char *sqlCode )
{
int i;
int rc;
sqlite3_stmt *stmt = NULL;
/* TRANSACT !! */
sqlite3_exec(db, "BEGIN", 0, 0, 0);
//printf("%d\n",strlen(sqlCode));
rc = sqlite3_prepare_v2( db, sqlCode, -1 , &stmt, NULL );
checkRC( db, rc,SQLITE_OK , "Error: Failed to prepare.\n" );
rc = sqlite3_step(stmt);
checkRC( db, rc,SQLITE_DONE, "Error: Failed to load.\n" );
sqlite3_exec(db, "COMMIT", 0, 0, 0);
sqlite3_finalize(stmt);
sqlCode[0] = '\0';
return 0;
}发布于 2011-11-17 11:54:08
我将检查sqlite3_finalize()的返回值&它返回SQLITE_OK (等于0)或错误代码(如果有的话)。因此,如果有任何错误,您将捕捉到它并在正式文档中找到它的解释。
这里我要提到的第二件事-- sqlite3_exec()是围绕sqlite3_prepare_v2()、sqlite3_step()和sqlite3_finalize()的包装器。在另一个sqlite3_prepare_v2() \ sqlite3_finalize()块中调用它,即使它是合法操作,也可以在所有查询完成之前提交事务。我会尝试移动事务的提交:
...
int sqlRet = sqlite3_finalize(stmt); // sqlRet will contain error code
sqlite3_exec(db, "COMMIT", 0, 0, 0);
...注意,如果发生任何错误,sqlite3_exec()也返回错误代码。您可以将对sqlite3_prepare_v2()、sqlite3_step()和sqlite3_finalize()的调用替换为对sqlite3_exec()的单次调用,并在更方便的情况下提供回调函数。在您的情况下(执行插入)回调是不需要的。sqlite3_exec()的第5‘参数可能是有用的-它是文本格式的错误消息。
一些有用的链接:
https://stackoverflow.com/questions/8000999
复制相似问题