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

Posted GarsonZhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展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

以上是关于扩展Exception,增加判断Exception是否为SQL引用约束异常方法!的主要内容,如果未能解决你的问题,请参考以下文章

判断Exception类中是否有InnerException属性

Sub的构造函数抛出了Exception异常增加新的catch块才能解决

2.建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmoun

有没有办法增加谷歌浏览器中 localStorage 的大小以避免 QUOTA_EXCEEDED_ERR: DOM Exception 22

java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(doubl

Throwable和Exception的区别