다음 코드는 C++에서 벡터 ID에없는 모든 ID를 삭제합니다. 삭제해야하는 ID가 인쇄되지만 ID 바인딩으로 인해 DELETE가 실패한 것으로 보입니다. (문에서 ID를 제거하고 참조 만 바인딩하면 잘 작동합니다).C++ SQLite3 준비 문을 사용하여 삭제되지 않음
CREATE TABLE IF NOT EXISTS Files (
ID LONGTEXT DEFAULT NULL,
Reference LONGTEXT NOT NULL,
FilePath LONGTEXT PRIMARY KEY NOT NULL,
ProcessedOn LONGTEXT NOT NULL)
권리 ID의 삭제 코드 :
rc = sqlite3_prepare_v2(db, "SELECT ID FROM Files WHERE Reference=? AND ID IS NOT NULL", -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 = (const char*)sqlite3_column_text(stmt, 0);
cout << "Checking: " << IDToCheck << endl;
if (find(IDs.begin(), IDs.end(), IDToCheck) == IDs.end()) {
cout << "Delete " << IDToCheck << endl;
//SHOWS ME THE CORRECT ID's BUT THE DELETE IS NOT WORKING. THE
//STATEMENT IS EXECUTED PROPERLY WHEN I ONLY USE IT WITH BOUND
//REFERENCE, SO BINDING the IDToCheck GOES WRONG?
sqlite3_bind_text(stmt2, 1, IDToCheck.c_str(), IDToCheck.length(), 0);
sqlite3_bind_text(stmt2, 1, Settings["Reference"].c_str(), Settings["Reference"].length(), 0);
rc2 = sqlite3_step(stmt2);
}
rc = sqlite3_step(stmt);
}
sqlite3_finalize(stmt);
sqlite3_finalize(stmt2);
"실패 할 것 같다", "확인해야 작동하지 않습니다. "더 구체적 일 수 있습니까? –
음, 레코드가 삭제되지 않습니다. 그러나 참조를 바인딩 할 때 ID =? 문을 제거하면 레코드를 잘 삭제합니다. 그러나 ID를 바인드 할 때 =? 다시 문을 레코드를 삭제하는 것보다. ** 내 견해로는 ID 바인딩이 실패합니다 ** –
디버거를 사용하여 t를 전달하고 있음을 확인 했습니까? 그는'sqlite3_bind_text()'함수에 값을 기대 했습니까? – MrEricSir