You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP SQLite查询返回Null但数据表有数据,该如何排查?

排查SQLite查询返回Null的问题

咱们一步一步揪出问题根源,你的代码里有几个关键细节没处理到位,导致明明数据库有数据却拿不到结果:

1. 数据库连接未打开

你只初始化了SQLiteConnection对象,但完全没调用dbConnection.Open()方法!连接处于关闭状态时,执行查询根本无法读取到数据库里的数据,这是最核心的问题。

2. 连接字符串格式错误

SQLite的连接字符串需要明确指定Data Source参数,直接传文件名是不合法的。正确的格式应该是这样:

"Data Source=RPR_REKENSOFTWARE_DB.db;Version=3;"

如果数据库文件不在程序的默认工作目录下,还需要加上完整的文件路径。

3. 列索引可能有误

SQLiteStatement的索引是从0开始计数的,dbState[1]取的是结果集的第二列。如果你的partNr是parts表的第一列,那你应该用dbState[0],否则就会取到错误的列(甚至空值)。

4. 资源未正确释放

使用SQLite相关对象时,最好用using语句包裹,确保资源能自动释放,避免内存泄漏或连接占用的问题。

修正后的代码示例

public static List<string> GetParts()
{
    var items = new List<string>();
    // 用using包裹连接,确保自动释放资源
    using (var dbConnection = new SQLiteConnection("Data Source=RPR_REKENSOFTWARE_DB.db;Version=3;"))
    {
        try
        {
            dbConnection.Open(); // 必须打开连接才能执行查询!
            string sSQL = @"SELECT partNr FROM parts;"; // 建议明确指定字段,避免*带来的索引混乱
            using (var dbState = dbConnection.Prepare(sSQL))
            {
                while (dbState.Step() == SQLiteResult.ROW)
                {
                    // 这里对应SELECT的字段位置,因为只查了partNr,所以用索引0
                    string partNr = dbState[0] as string;
                    // 加个判断避免空值混入列表
                    if (!string.IsNullOrEmpty(partNr))
                    {
                        items.Add(partNr);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"查询出错:{ex.Message}\n{ex.StackTrace}");
            throw; // 直接throw保留原始堆栈信息,不要重新throw ex
        }
    }
    return items;
}

额外排查建议

  • 尽量避免用SELECT *,明确写出需要的字段名,这样列索引的对应关系更清晰,也能减少不必要的数据读取。
  • 在catch块里打印完整的异常信息(包括堆栈),能帮你更快定位到具体的错误点。

内容的提问来源于stack exchange,提问作者Robin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:36:06