SQLite查询在C++程序中无效但DB Browser正常的问题排查
SQLite查询提示“no such table”问题排查与解决
问题现象
- 基于SQLite 3.43.1开发的C++程序,创建表并插入数据后,执行查询语句
SELECT NAME FROM "mytable"返回错误码1,提示no such table: mytable - 程序内执行
SELECT * FROM sqlite_master WHERE name LIKE 'mytable'查询系统表,结果为空;但断开程序连接后,用DB Browser(内置SQLite 3.35.5)执行相同查询可正常读取数据 - 尝试
sqlite_exec和prepare_v2+step+sqlite3_column_text两种查询方式,均出现相同问题 - 程序执行流程:删除旧数据库文件→创建新数据库及表→执行两次数据写入(DB Browser验证数据已写入)→执行查询时报错
- 编译环境:Ubuntu WSL下g++ 12.3.0,使用sqlite-amalgamation-343100中的sqlite3.h和sqlite3.c文件
已定位的代码错误
从提供的示例代码中,确认以下关键问题:
- DB类write函数存在未定义变量:未定义变量会导致写入逻辑异常,可能引发数据未提交、连接状态异常等问题
- createTables函数采用值传递DB对象:值传递会生成DB对象的副本,副本的数据库连接与原对象完全独立,建表操作仅在副本连接中生效,原连接对应的数据库并未创建目标表
- 建表语句存在多余引号:错误的引号嵌套会导致SQLite解析出异常的表名,实际创建的表与查询的
mytable不匹配
修复方案
- 补全write函数的变量定义:修正未定义变量问题,确保写入逻辑能正确执行,必要时添加事务提交逻辑
- 修改createTables的参数传递方式:将DB对象改为引用传递(如
void createTables(DB& db)),保证建表操作作用在同一数据库连接上 - 修正建表语句格式:确保建表语句无多余引号,正确写法示例:
CREATE TABLE mytable (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, NAME TEXT NOT NULL, VAL TEXT); - 添加全链路错误检查:在
sqlite3_open、sqlite_exec、sqlite3_prepare_v2等所有SQLite API调用后,立即检查返回码并打印错误信息,便于快速定位问题 - 显式提交事务:若未开启自动提交,在创建表、插入数据后执行
COMMIT语句,确保所有操作持久化到数据库文件
内容的提问来源于stack exchange,提问作者whataretheydoing
相关产品推荐
相关产品推荐

