在设计数据表时,如果将某些列设置为关联其它表的外键,那么如果对其进行增加、修改操作时,其关联表若没有相匹配的记录则报错,或者在对其关联表进行删除时,也会报错,这就是外键约束的作用,当然除了外键还有许多约束,在此暂不讨论,本篇文章主要讲的是,如何判断是否为SQL的引用约束异常,从而能够更好的将SQL复杂的报错转换为用户能够明白的友好提示。
SQL错误代码均存放在master.sys.messages表中
经过断点跟踪异常,得出,异常的Number就是对应这里的message_id,如图:
因此,我们可以写出扩展方法:
扩展Exception,增加判断Exception是否为SQL引用约束异常方法(IsSqlReferenceConstraintException):
/// <summary> /// 查看是不是约束冲突 /// </summary> /// <param name="exception"></param> /// <returns></returns> public static bool IsSqlReferenceConstraintException(this Exception exception) { var baseEx = exception.GetBaseException(); if (baseEx is SqlException) { if ((baseEx as SqlException).Number == 547) { return true; } else { return false; } } else if (baseEx != null && !object.ReferenceEquals(exception, baseEx))//如果基类不为空且不等于异常本身,则继续回调查找 { return IsSqlReferenceConstraintException(baseEx); } return false; }
调用代码如下:
try { base_module c = new base_module() { rowID = rowID }; entities.Entry(c).State = System.Data.EntityState.Deleted; entities.SaveChanges(); return GZAPISuccess(); } catch (DbUpdateException ex) { if (true == ex.IsSqlReferenceConstraintException()) { return GZAPIBadRequest("删除失败,存在关联数据", EnumResponseCode.errSqlReferenceConstraintException, SqlOOT.DELETE); } else throw ex; }
参考资料:https://www.cnblogs.com/zuowj/p/4414031.html
参考资料:http://www.cnblogs.com/liuzhixian/p/3839787.html
扩展Exception,增加判断Exception是否为SQL引用约束异常方法!
原文:https://www.cnblogs.com/GarsonZhang/p/8757351.html