C++ SQLite3 不使用预准备语句删除
C++ SQLite3 not deleting with prepared statement
我在C++中有以下代码来删除所有不在矢量ID中的ID。将打印应删除的 ID,但由于 ID 绑定,删除似乎失败。(当我从语句中删除 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() 文档说:
BLOB和字符串绑定接口的第五个参数是一个析构函数,用于在 SQLite 完成 BLOB 或字符串后释放它。调用析构函数以释放 BLOB 或字符串,即使对绑定 API 的调用失败也是如此。如果第五个参数是特殊值SQLITE_STATIC,则 SQLite 假定信息位于静态的非托管空间中,不需要释放。如果第五个参数的值为 SQLITE_TRANSIENT,则 SQLite 会在 sqlite3_bind_*() 例程返回之前立即创建自己的数据私有副本。
您没有使用显式析构函数释放的动态缓冲区,因此不能使用函数指针。c_str()
返回的缓冲区不是不受管理的,因此不能使用SQLITE_STATIC
。 所以你必须使用SQLITE_TRANSIENT
.
此外,您必须检查错误(检查rc2
,并调用sqlite3_errmsg()。
此外,您需要先重置语句,然后才能再次执行它。
相关文章:
- 是否可以使用if constexpr删除控制流语句
- 为什么当我从语句检查中删除"+ mod"时,以下程序给出错误的答案。问题链接:https://www.codechef.com/problems/FFC219B
- 是否可以删除此条件语句
- C++ SQLite3 不使用预准备语句删除
- C++ SQLite3 准备的删除语句不起作用
- 在设置 if-else 语句以删除特定货币并保持更新时遇到问题
- 删除"超出矢量误差范围"的打印语句后输出不同的根本原因
- 当我通过删除临时节点来释放内存时,我会得到读取访问违规行为.但是只有当我返回错误语句时
- 通过找到一种删除许多 if 语句的方法来简化代码
- For 循环结束自身并终止正在运行的程序,但在删除斜率计算语句时正常运行
- 正在删除的在switch语句中使用的GLSL统一格式
- 如何在 android L 上加载 OpenCV 时删除日志记录语句
- 从选取的语句中删除选项
- 正在删除导致分段错误的cout语句
- 有没有办法从这个sql语句和逻辑中删除select count(*)
- 基于条件语句删除循环中的矢量元素
- 编译器是否删除模板中类型的条件语句
- 我应该把删除语句在我的代码中,以消除内存泄漏
- NDK如何在发布时删除日志调试语句
- 删除多余的并行语句时的不同程序行为