zoukankan      html  css  js  c++  java
  • 扩展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

    慎于行,敏于思!GGGGGG
  • 相关阅读:
    spark
    mongdb
    redis
    mysql
    kylin
    kafka
    hadoop+hive+hbase+kylin
    git
    elasticsearch
    clickhouse
  • 原文地址:https://www.cnblogs.com/GarsonZhang/p/8757351.html
Copyright © 2011-2022 走看看