0
SQLite3データベースをループするC++アプリケーションがあります。各行には、ベクトルと照合されるIDが含まれています。 DB内のIDがベクタに存在しない場合は、プリペアドステートメントで削除する必要があります。私は次のコードを使用しますが、IDは削除されません。また、sqlite3_step(stmt2)
関数からエラーメッセージを受け取ることはできません。そのようにあなたがそれを使用する前に、あなたの文を完成するのでC++ SQLite3はdeleteステートメントが機能しない
//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);
私はこれを見ませんでした...これはコピーエラーです。あなたの良い目のためにたくさんありがとう:) –
私はその行を削除しましたが、それでもまだ行を削除していませんか? –
ここにいくつかの考えがあります:各レコードにステートメントを使用して、パラメータなしでコンパイルしてみてください(デバッグの目的のみ)。それがうまくいくならば、あなたはパラメータの扱いに問題があるかもしれません。別のことは、あなたのIDに整数と文字列を混ぜていることです。特別な理由がない限り、私はSQLite呼び出しの整数に固執します。 – themiurge