【问题标题】:C++ SQLite3 prepared delete statement not workingC ++ SQLite3准备好的删除语句不起作用
【发布时间】:2017-05-09 16:51:51
【问题描述】:

我有一个循环通过 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);

【问题讨论】:

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


    【解决方案1】:

    您不能在while之前调用finalize 函数,因为这样您在使用它之前就完成了您的语句。根据SQLite documentation(强调我的):

    应用程序尝试使用准备好的严重错误 完成后的声明。任何使用准备好的语句 完成后可能会导致未定义和不受欢迎的 行为,例如段错误和堆损坏。

    【讨论】:

    • 哇,我没有看到这个...这将是一个复制错误。非常感谢你的好眼光:)
    • 我已经删除了该行,但它仍然没有删除任何行?
    • 这里有几个想法:尝试为每条记录使用一个语句并在不带参数的情况下编译它(仅用于调试目的);如果它有效,那么您的参数处理可能有问题。另一件事是您正在为您的 ID 混合整数和字符串。我也会坚持使用整数进行 SQLite 调用,除非你有特殊的理由不这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2014-10-09
    • 2015-10-11
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多