2017-05-09 10 views
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); 

答えて

2

あなたは、whileブロックの前にfinalize機能を呼び出すことはできません。 SQLite documentation(強調鉱山)あたりのとおり:

それはを確定された後に調製 ステートメントを使用しようとするアプリケーションのための痛ましいエラーです。準備されたステートメント を使用して確定した後に、は、定義されていない望ましくない結果となる可能性があります。 segfaultsやヒープの破損などです。

+0

私はこれを見ませんでした...これはコピーエラーです。あなたの良い目のためにたくさんありがとう:) –

+0

私はその行を削除しましたが、それでもまだ行を削除していませんか? –

+0

ここにいくつかの考えがあります:各レコードにステートメントを使用して、パラメータなしでコンパイルしてみてください(デバッグの目的のみ)。それがうまくいくならば、あなたはパラメータの扱いに問題があるかもしれません。別のことは、あなたのIDに整数と文字列を混ぜていることです。特別な理由がない限り、私はSQLite呼び出しの整数に固執します。 – themiurge

関連する問題