C ++ SQLite3编写的delete语句无法正常工作

时间:2017-05-09 16:51:52

标签: c++ sqlite prepared-statement sql-delete

我有一个循环通过SQLite3数据库的C ++应用程序。每行包含一个ID,该ID根据向量进行检查。如果向量中不存在DB中的ID,则应使用预准备语句删除它。我使用以下代码,但ID不会被删除。我也无法从sqlite3_step(stmt2)函数中收到错误消息。

//SETTINGS["Reference"] CONTAINS THE REFERENCE FOR THE ID's (IT's 1 FOR UNDERNEATH EXAMPLE)


vector<int> IDs; //THIS VECTOR CONTAINS THE ID's IN MY APPLICATION
rc = sqlite3_prepare_v2(db, "SELECT ID FROM Files WHERE Reference=?", -1, &stmt, 0);
sqlite3_bind_text(stmt, 1, Settings["Reference"].c_str(), Settings["Reference"].length(), 0);
CheckDBError(rc);
rc = sqlite3_step(stmt);
sqlite3_stmt* stmt2;
int rc2 = sqlite3_prepare_v2(db, "DELETE FROM Files WHERE ID=? AND Reference=?", -1, &stmt2, 0);
CheckDBError(rc2);
while(rc == SQLITE_ROW) {
    string IDToCheck = NumberToString(sqlite3_column_int64(stmt, 0));
    if (std::find(IDs.begin(), IDs.end(), IDToCheck) == IDs.end()) { //VERIFY AGAINST VECTOR WORKS AS EXPECTED

        //I GET HERE WITH ALL MY ID's I HAVE CHECKED THAT ALREADY :)

        sqlite3_bind_text(stmt2, 1, IDToCheck.c_str(), IDToCheck.length(), 0);
        sqlite3_bind_text(stmt2, 2, Settings["Reference"].c_str(), Settings["Reference"].length(), 0);
        rc2 = sqlite3_step(stmt2);

        //CAN'T GET ANY ERROR MESSAGE (SO QUERY IS FINE, WHICH SEEMS LIKE IT?)

        }
    rc = sqlite3_step(stmt);
    }
sqlite3_finalize(stmt);
sqlite3_finalize(stmt2);

1 个答案:

答案 0 :(得分:2)

你不能在finalize块之前调用while函数,因为这样你在使用它之前就完成了你的陈述。根据{{​​3}}(强调我的):

  

尝试使用已准备好的应用程序是一个严重错误   完成后的声明。任何使用准备好的声明   在最终确定之后会导致未定义且不合需要   行为,例如段错误和堆损坏。