2017-05-09 7 views
0

SQLite3 데이터베이스를 반복하는 C++ 응용 프로그램이 있습니다. 각 행은 벡터에 대해 확인 된 ID를 포함합니다. DB에있는 ID가 벡터에 없으면 준비된 문으로 삭제해야합니다. 다음 코드를 사용하지만 ID는 삭제되지 않습니다. 나도 sqlite3_step(stmt2) 함수에서 오류 메시지를받을 수 없습니다. 그런 식으로 당신이 그것을 사용하기 전에 문을 완료하기 때문에C++ SQLite3 prepared 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 및 heap 손상과 같은 정의되지 않고 바람직하지 않은 동작이 발생할 수 있습니다.

+0

와우, 나는 이것을 보지 못했습니다 ... 이것은 오류입니다. 좋은 눈을 가져 주셔서 감사합니다 :) –

+0

그 행을 삭제 했는데도 여전히 행을 삭제하지 않고 있습니까? –

+0

다음은 몇 가지 생각입니다. 각 레코드에 대한 문을 사용하고 매개 변수없이 컴파일합니다 (디버깅 목적으로 만 사용). 작동한다면 매개 변수 처리에 문제가있을 수 있습니다. 또 다른 점은 ID에 정수와 문자열을 혼합한다는 것입니다. 당신이 특별한 이유가 없다면 나는 SQLite 호출을위한 정수를 고수 할 것이다. – themiurge