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

C# UWP SQLite应用:无法从SqliteException获取ErrorCode

我来帮你搞定这个问题!针对你在UWP应用里调试SqliteException错误码遇到的问题,咱们一步步拆解解决:

解决UWP中SqliteException ErrorCode在即时窗口无法正常显示的问题

首先得明确:SqliteException和你熟悉的SqlException结构不一样——它并没有把SQLite原生错误码直接塞到继承自Exception的ErrorCode属性里,咱们得找对正确的属性来获取目标值。

核心原因

你在即时窗口直接查ex.ErrorCode时,拿到的其实是通用的Windows HRESULT值,不是SQLite专属的错误码。SQLite的错误信息是存在它自己的专属属性里的。

解决步骤

1. 用对属性查正确的错误码

如果你用的是官方推荐的Microsoft.Data.Sqlite库,SqliteException有两个关键属性可以用:

  • SqliteErrorCode:返回SqliteErrorCode枚举(比如SqliteErrorCode.Constraint、SqliteErrorCode.NotFound),这是SQLite原生的错误类型
  • 要获取对应的数值,直接把枚举强转成int就行

在即时窗口里这么查就对了:

// 获取SQLite枚举错误码
ex.SqliteErrorCode
// 转成数值看具体数字
(int)ex.SqliteErrorCode
// 如果要看Windows封装的HRESULT值
ex.HResult

2. 模拟特定错误的正确姿势

要验证异常处理逻辑,你可以直接构造异常,或者执行触发特定错误的SQL:
比如要触发唯一约束错误,写个重复插入的逻辑就行:

try
{
    using (var cmd = connection.CreateCommand())
    {
        cmd.CommandText = "INSERT INTO Users (Id, Name) VALUES (@id, @name)";
        cmd.Parameters.AddWithValue("@id", 1);
        cmd.Parameters.AddWithValue("@name", "TestUser");
        // 第一次插入正常
        cmd.ExecuteNonQuery();
        // 第二次插入同一个ID,触发约束错误
        cmd.ExecuteNonQuery();
    }
}
catch (SqliteException ex)
{
    // 在这里打个断点,然后用上面的即时窗口命令查错误码
    var sqliteCode = ex.SqliteErrorCode;
    var codeNumber = (int)sqliteCode; // 这里会拿到19,对应SQLite的CONSTRAINT错误
}

3. 静态类里的调试小技巧

如果你的DataAccessLayer是静态类,调试时要注意别让异常对象被GC回收——可以在catch块里先把异常赋值给临时变量,再断点:

public static void InsertUserData()
{
    try
    {
        // 你的数据库操作代码
    }
    catch (SqliteException ex)
    {
        var tempEx = ex; // 用临时变量锁住异常,防止被回收
        // 在这里设断点,再去即时窗口查tempEx的属性
        HandleDbException(tempEx);
    }
}

额外提醒

如果你用的是第三方SQLite库(比如SQLite-net),异常属性可能不一样——比如SQLite-net的SQLiteException是用Result属性返回错误码数值的,记得对应调整查询方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:39:07