• 00
  • :
  • 00
  • :
  • 00

扩展Exception,增加判断Exception是否为SQL引用约束异常方法!

在设计数据表时,如果将某些列设置为关联其它表的外键,那么如果对其进行增加、修改操作时,其关联表若没有相匹配的记录则报错,或者在对其关联表进行删除时,也会报错,这就是外键约束的作用,当然除了外键还有许多约束,在此暂不讨论,本篇文章主要讲的是,如何判断是否为SQL的引用约束异常,从而能够更好的将SQL复杂的报错转换为用户能够明白的友好提示。

SQL错误代码均存放在master.sys.messages表中

image

经过断点跟踪异常,得出,异常的Number就是对应这里的message_id,如图:

image

因此,我们可以写出扩展方法:

扩展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

posted @ 2018-04-09 09:24  Garson_Zhang  阅读(444)  评论(0编辑  收藏  举报