为了加速表插入,我将insert语句(所有semicol终止)连接成一个单独的字符串(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;
}
答案 0 :(得分:0)
我会检查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_exec()来替换对sqlite3_prepare_v2(),sqlite3_step()和sqlite3_finalize()的调用,并在更方便时提供回调函数。在您的情况下(执行插入)不需要回调。 sqlite3_exec()的第5个参数可能很有用 - 它是文本格式的错误消息。
一些有用的链接: