C++ SQLite3 准备的删除语句不起作用

C++ SQLite3 prepared delete statement not working

本文关键字:删除 语句 不起作用 SQLite3 C++      更新时间:2023-10-16

我有一个循环访问SQLite3数据库的C++应用程序。每行包含一个 ID,该 ID 根据向量进行检查。如果数据库中的 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);

您不得在 while之前调用 finalize 函数,因为这样您就可以在使用语句之前完成语句。根据SQLite文档(强调我的(:

对于应用程序来说,尝试使用准备好的 定稿后的声明。任何使用预准备语句 最终确定后可能会导致未定义和不受欢迎的 段错误和堆损坏等行为。