c# - 如何捕获 DbUpdateException 唯一异常?
问题描述
我在标签表中已经存在标签时插入标签,因此它返回消息,
消息“无法在具有唯一索引 'IX_Tag_Name' 的对象 'dbo.Tag' 中插入重复的键行。重复的键值为 (Lemon)。\r\n语句已终止。” 细绳
我试图通过检查Number
2601 来捕获此唯一异常,但无法访问该Number
属性。
显然,这就是您假设捕获异常但ex.InnerException.InnerException
为空的方式,因此 switch 语句永远不会执行。
如何使用 EF6 和 SQL Server 捕获 UniqueKey Violation 异常?
catch (DbUpdateException ex)
{
if (ex.InnerException.InnerException is SqlException sqlException)
{
switch (sqlException.Number)
{
// If the tag already exists
case 2601: // Unique Key violation
}
}
}
解决方案
您的代码正在检查您的内部异常的内部异常。这是空的,因此您的代码失败了。而是这样做:
catch (DbUpdateException ex)
{
if (ex.InnerException is SqlException sqlException)
{
switch (sqlException.Number)
{
// If the tag already exists
case 2601: // Unique Key violation
}
}
}
推荐阅读
- asp.net-core - 为 asp.net core MVC 2.2 保存的 Sqlite 数据库在哪里?
- wordpress - wordpress 离线编辑主题
- iis - 在 IIS 下运行 ASP.Net Core 时的 AppPool Identity?
- php - 在php的foreach循环中搜索动态键值
- .net - PowerShell - 我怎样才能 Reflection.Emit 正确的 IL OpCodes 来调用 [String]::Join in a DynamicMethod?
- c++ - C ++中“__declspec(dllexport)类class_name”和“class __declspec(dllexport)class_name”有什么区别
- c# - C# 中是否有基于事件的非阻塞多线程 HTTP 请求系统
- python - 如何获取绑定方法的定义类?
- python - 如何让命令 python filename.py 工作?
- apache-spark - Pyspark SQL 作业通过读取固定宽度而不是镶木地板来减慢速度