sqlite3_bind_text绑定字符串无效但bind_double正常的问题排查
SQLite绑定字符串时sqlite3_step返回SQLITE_DONE无结果的问题修复
问题根源
你的代码中setVariable的字符串绑定方法存在两个关键错误:
字符串长度计算错误
在sqlite3_bind_text调用中,你使用了sizeof(val1)作为字符串长度参数。val1是const char*类型,sizeof(val1)得到的是指针的字节大小(32位系统为4,64位系统为8),而非字符串的实际长度。这会导致SQLite读取不完整或错误的字符串内容,最终查询不到匹配的数据。内存生命周期问题
你传入的最后一个参数是NULL,但sval是函数内的局部变量,函数执行完毕后sval会被销毁,val1指向的内存会失效。SQLite默认会直接使用传入的指针,不复制内容,这会导致绑定的字符串内容变成垃圾数据。硬编码索引隐患
两个setVariable方法都硬编码了绑定索引为1,完全忽略了传入的index参数,这会导致多参数查询时绑定位置错误。
修复后的代码
// 绑定字符串参数 void PreparedQuery::setVariable(int index, const string& value) { // 使用字符串实际长度,传入SQLITE_TRANSIENT让SQLite复制内容 int rc = sqlite3_bind_text( stmt, index, value.c_str(), static_cast<int>(value.size()), SQLITE_TRANSIENT ); checkerr(rc); } // 绑定double参数(同步修复索引硬编码问题) void PreparedQuery::setVariable(int index, double value) { int rc = sqlite3_bind_double(stmt, index, value); checkerr(rc); }
额外验证点
- 确认数据库中
foodname字段确实存在与传入值完全匹配的记录(SQLite默认对TEXT类型的比较是大小写敏感的,若需要不敏感可使用COLLATE NOCASE) - 检查
sqlite3_bind_text的返回值,确保没有隐藏错误(你的checkerr函数应该能捕获返回非SQLITE_OK的情况)
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

