当绑定发生在另一个函数中时,Sqlite 找不到行 _only_
Sqlite doesn't find row _only_ when binding takes places in another function
所以我给自己写了一个小包装函数来为我做一个准备好的语句:
sqlite3_stmt* Gladiateur::run_query_unfinalized(string query, vector<string> inputs){
sqlite3_stmt *statement;
// Prepare SQL
sqlite3_prepare_v2(db, query.c_str(), -1, &statement, NULL);
// Bind parameter
sqlite3_bind_text(statement, 1, inputs[0].c_str(), -1, NULL);
return statement;
}
通常它会通过输入向量并绑定所有字符串,但我简化了代码以找出错误所在。
我还有另一个功能set_list(也简化):
int Gladiateur::set_list (string list_name) {
vector<string> bind = {list_name};
sqlite3_stmt *statement = this->run_query_unfinalized("SELECT id FROM lists WHERE name = ? LIMIT 1", bind);
printf("code %dn", sqlite3_step(statement));
sqlite3_finalize(statement);
return 1;
}
我调用set_list,得到"代码 101",这仅意味着没有 SQL 错误,但没有检索到行。不过,我知道存在匹配的行。
奇怪的部分来了:我移动了这条线
sqlite3_bind_text(statement, 1, inputs[0].c_str(), -1, NULL);
到 set_list 函数中,就在 printf 上方,然后写入bind[0]
而不是 inputs[0]
。它有效!我得到"代码 100",找到了该行,当我检查时它也给了我正确的 id。
但我想在run_query_unfinalized
做所有的绑定......我真的很困惑为什么它不起作用。也许我不能像那样传递statement
变量?
sqlite3_bind_text函数的最后一个参数不能为 NULL:
BLOB和字符串绑定接口的第五个参数是一个析构函数,用于在 SQLite 完成 BLOB 或字符串后释放它。调用析构函数以释放 BLOB 或字符串,即使对绑定 API 的调用失败也是如此。如果第五个参数是特殊值SQLITE_STATIC,则 SQLite 假定信息位于静态的非托管空间中,不需要释放。如果第五个参数的值为 SQLITE_TRANSIENT,则 SQLite 会在 sqlite3_bind_*() 例程返回之前立即创建自己的数据私有副本。
在这种情况下,您需要 SQLITE_TRANSIENT
.
Gladiateur::run_query_unfinalized(string query, vector<string> inputs)
vector<string> inputs
是一个副本,当函数返回时,它不再存在。
也许您应该将其更改为:
Gladiateur::run_query_unfinalized(const string& query, const vector<string>& inputs)
有了参考,c_str
应该生存下来做你想做的事情。
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 找不到QtResource文件中的文件
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 找不到以下加速库:boost_fiber
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误
- "assimp/config.h"找不到,但它在文件夹中
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++系统找不到指定的文件错误
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- vcpkg 添加新库,但找不到
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 当绑定发生在另一个函数中时,Sqlite 找不到行 _only_