【发布时间】:2017-08-04 15:48:45
【问题描述】:
我在 C++ 中有以下代码来删除所有不在向量 ID 中的 ID。打印了应该删除的 ID,但是由于 ID 绑定,DELETE 似乎失败了。 (当我从语句中删除 ID 并只绑定引用时,效果很好)。
这就是数据库的创建方式:
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);
【问题讨论】:
-
“似乎失败了”“不工作”你能说得更具体点吗?
-
您是否使用调试器来验证您是否将预期值传递给
sqlite3_bind_text()函数? -
rc和rc2怎么样?并阅读sqlite3_bind_text() documentation 对其最后一个参数的看法。 -
如果某个步骤失败,您需要检查返回值并记录相应的错误信息。最后一个参数不能是
0。 -
正确的。您不了解文档的哪一部分?
标签: c++ sqlite prepared-statement