C++ 使用C+中的prepare语句在SQLite中大容量插入数据+;

C++ 使用C+中的prepare语句在SQLite中大容量插入数据+;,c++,sqlite,C++,Sqlite,我有一个std::vector,有超过100000条JSON记录。我需要在quick中将这些记录插入SQLite数据库。首先,我试着一个接一个地插入到数据库中,但这需要1个多小时才能完成 然后我搜索是否有任何方法可以使用SQLite一次性插入批量数据(批处理数据)。但缺乏这方面的资源。然后我尝试了以下代码。对于数据插入,我使用带有绑定参数的sqlite3\u prepare语句。我需要为批量插入扩展此方法 void insertSAData(vector<json> saData){

我有一个
std::vector
,有超过100000条JSON记录。我需要在quick中将这些记录插入SQLite数据库。首先,我试着一个接一个地插入到数据库中,但这需要1个多小时才能完成

然后我搜索是否有任何方法可以使用SQLite一次性插入批量数据(批处理数据)。但缺乏这方面的资源。然后我尝试了以下代码。对于数据插入,我使用带有绑定参数的
sqlite3\u prepare
语句。我需要为批量插入扩展此方法

void insertSAData(vector<json> saData){
        sqlite3_mutex_enter(sqlite3_db_mutex(db));
        char* errorMessage;
        sqlite3_exec(db, "PRAGMA synchronous=OFF", NULL, NULL, &errorMessage);
        sqlite3_exec(db, "PRAGMA count_changes=OFF", NULL, NULL, &errorMessage);
        sqlite3_exec(db, "PRAGMA journal_mode=MEMORY", NULL, NULL, &errorMessage);
        sqlite3_exec(db, "PRAGMA temp_store=MEMORY", NULL, NULL, &errorMessage);

        sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);

        char const *szSQL = "INSERT INTO SA_DATA (DATA_ID,P_KEY,AMOUNT,AMOUNT_INDEX) VALUES (?,?,?,?);";
        int rc = sqlite3_prepare(db, szSQL, -1, &stmt, &pzTest);

        if( rc == SQLITE_OK ) {
            for(int x=0;x<saData.size();x++){
                // bind the value
                sqlite3_bind_int(stmt, 1, saData[x].at("lastSAId"));
                std::string hash = saData[x].at("public_key");
                sqlite3_bind_text(stmt, 2,  hash.c_str(), strlen(hash.c_str()), 0);
                sqlite3_bind_int64(stmt, 3, saData[x].at("amount"));
                string amount_index = saData[x].at("amount_idx");
                sqlite3_bind_int(stmt, 4, atoi(amount_index.c_str()));

                sqlite3_step(stmt);
                sqlite3_finalize(stmt);
            }
        }else{
            fprintf(stderr, "SQL error: %s\n", zErrMsg);
            sqlite3_free(zErrMsg);
        }

        sqlite3_mutex_leave(sqlite3_db_mutex(db));
    }
void insertSAData(向量saData){
sqlite3_mutex_enter(sqlite3_db_mutex(db));
字符*错误消息;
sqlite3_exec(db,“PRAGMA synchronous=OFF”、NULL、NULL和errorMessage);
sqlite3_exec(db,“PRAGMA count_changes=OFF”、NULL、NULL和errorMessage);
sqlite3_exec(db,“PRAGMA journal_mode=MEMORY”,NULL、NULL和errorMessage);
sqlite3_exec(数据库,“PRAGMA temp_store=MEMORY”,NULL、NULL和errorMessage);
sqlite3_exec(db,“开始事务”,NULL,NULL和errorMessage);
char const*szSQL=“插入SA_数据(数据ID、P_键、金额、金额索引)值(?,,?);”;
int rc=sqlite3_prepare(db、szSQL、-1、&stmt、&pzTest);
如果(rc==SQLITE_OK){

对于(intx=0;x这段代码解决了我的问题

void insertSAData(vector<json> saData){
        sqlite3_mutex_enter(sqlite3_db_mutex(db));
        char* errorMessage;
        sqlite3_exec(db, "PRAGMA synchronous=OFF", NULL, NULL, &errorMessage);
        sqlite3_exec(db, "PRAGMA count_changes=OFF", NULL, NULL, &errorMessage);
        sqlite3_exec(db, "PRAGMA journal_mode=MEMORY", NULL, NULL, &errorMessage);
        sqlite3_exec(db, "PRAGMA temp_store=MEMORY", NULL, NULL, &errorMessage);

        sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);

        char const *szSQL = "INSERT INTO SA_DATA (DATA_ID,P_KEY,AMOUNT,AMOUNT_INDEX) VALUES (?,?,?,?);";
        int rc = sqlite3_prepare(db, szSQL, -1, &stmt, &pzTest);

        if( rc == SQLITE_OK ) {
            for(int x=0;x<saData.size();x++){
                // bind the value
                sqlite3_bind_int(stmt, 1, saData[x].at("lastSAId"));
                std::string hash = saData[x].at("public_key");
                sqlite3_bind_text(stmt, 2,  hash.c_str(), strlen(hash.c_str()), 0);
                sqlite3_bind_int64(stmt, 3, saData[x].at("amount"));
                string amount_index = saData[x].at("amount_idx");
                sqlite3_bind_int(stmt, 4, atoi(amount_index.c_str()));

                int retVal = sqlite3_step(stmt);
                if (retVal != SQLITE_DONE)
                {
                    printf("Commit Failed! %d\n", retVal);
                }

                sqlite3_reset(stmt);
            }

            sqlite3_exec(db, "COMMIT TRANSACTION", NULL, NULL, &errorMessage);
            sqlite3_finalize(stmt);
        }else{
            fprintf(stderr, "SQL error: %s\n", zErrMsg);
            sqlite3_free(zErrMsg);
        }

        sqlite3_mutex_leave(sqlite3_db_mutex(db));
    }
void insertSAData(向量saData){
sqlite3_mutex_enter(sqlite3_db_mutex(db));
字符*错误消息;
sqlite3_exec(db,“PRAGMA synchronous=OFF”、NULL、NULL和errorMessage);
sqlite3_exec(db,“PRAGMA count_changes=OFF”、NULL、NULL和errorMessage);
sqlite3_exec(db,“PRAGMA journal_mode=MEMORY”,NULL、NULL和errorMessage);
sqlite3_exec(数据库,“PRAGMA temp_store=MEMORY”,NULL、NULL和errorMessage);
sqlite3_exec(db,“开始事务”,NULL,NULL和errorMessage);
char const*szSQL=“插入SA_数据(数据ID、P_键、金额、金额索引)值(?,,?);”;
int rc=sqlite3_prepare(db、szSQL、-1、&stmt、&pzTest);
如果(rc==SQLITE_OK){

对于(int x=0;x1),可能必须在循环后移动sqlite3_finalize()调用,因为它会破坏准备好的语句;2)最后的提交可能是missing@rpress我不明白你在第2点中说了什么。你能解释一下吗?这段代码对我也很有用,谢谢你的好解决方案。很高兴听到这有什么区别?@jww stmt与sqlite3\u reset函数一起重用。事务已通过“COMMIT transaction”查询提交。