首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlite3事务

sqlite3事务
EN

Stack Overflow用户
提问于 2011-11-03 19:52:26
回答 1查看 2.8K关注 0票数 0

为了加快表插入速度,我将insert语句(全部终止为分词)连接到一个字符串(sqlCode)中,即PREPAREd然后STEPed。

我的测试文件中有10000条记录,但表中只有1000个插入的记录。

我做错了什么?

我知道我应该将参数绑定到insert语句,但是对于这一点还是新手,接下来我将学习绑定参数。此外,返回值(0)重置其他地方使用的计数器。

谢谢。

弗兰克。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 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()块中调用它,即使它是合法操作,也可以在所有查询完成之前提交事务。我会尝试移动事务的提交:

代码语言:javascript
复制
...
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‘参数可能是有用的-它是文本格式的错误消息。

一些有用的链接:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8000999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档