【问题标题】:Catching sql exceptions in a provider agnostic way以与提供者无关的方式捕获 sql 异常
【发布时间】:2013-09-01 14:42:08
【问题描述】:

我正在将我的一个 Asp.Net 项目中的数据访问代码从 MySQL 转换为 MSSQL。我借此机会尝试删除对提供者特定类或命名空间的任何依赖。

所以我没有直接使用 MySqlCommand 或 SqlCommand 类,而是使用 DbProviderFactories.GetFactory() 方法返回 DbCommand 对象。

我遇到的一个问题是我的代码捕获了 MySqlExpection 异常。我想要一种与提供者无关的方法来捕获 Sql 异常。这可能吗?

【问题讨论】:

  • 澄清一下,您捕获的异常是在数据层内部还是外部?
  • Sql 实现 DBexception。我假设 MSSQL 也可以。你试过 DBexceptoin 吗?我没有要测试的 MSSQL。
  • 在数据访问层内。
  • @Blam。 Syste.Data.Common.DBException 类正是我想要的。如果您想将其作为答案发布,我会投票并接受它作为正确答案。

标签: .net database


【解决方案1】:

Sql 实现 DBexception。我认为 MSSQL 也可以。
您尝试过 DBexception 吗?
我没有要测试的 MSSQL。

【讨论】:

    【解决方案2】:

    如果对该主题没有深入了解,我的想法是异常是从提供数据库访问权限的具体类中抛出的。我可以猜测,一些例外可能在本质上很常见,但其他可能不常见。我相信记录特定错误而不是一些抽象是一个好习惯。

    查看this SO questionMSDN 了解更多信息。

    【讨论】:

      【解决方案3】:

      我会推荐这样的东西。这样,您可以抛出通用 sql 异常或抛出与给定逻辑关联的自定义异常,例如 ConnectionTimedOutException。

      catch(Exception ex)
      {
          if(DbProviderFactories.GetException(ex) is CustomSQLException)
          {
              //logic here
          }
          throw;
      }
      
      //Factory method
      public Exception GetException(Exception ex)
      {
          Exception result;
          //Identifying which is the current one
          switch (CurrentProvider)
          {   
              case Provider.SQLServer: 
                  //logic here
                  result = new CustomSQLServerException(ex); //which extends CustomSQLException
                  break;
              default:
                  result = ex;
                  break;
          }
          return result;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-05-17
        • 2019-08-25
        • 1970-01-01
        • 2013-02-06
        • 2016-09-07
        • 2011-06-30
        • 2015-01-04
        • 2019-11-15
        • 1970-01-01
        相关资源
        最近更新 更多