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
相关产品推荐
相关产品推荐

