【问题标题】:How to handle exception from specific database error如何处理来自特定数据库错误的异常
【发布时间】:2012-09-20 01:49:39
【问题描述】:

我正在尝试创建这样的交易:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,
      options))
{
    try
    {
        dbContext.MyTable.PartnerId = someGuid;
        dbContext.SaveChanges();
        scope.Complete();
        dbContext.AcceptAllChanges()
    }
    catch (Exception ex)
    {
        log.LogMessageToFile("Exception - ExceptionType: " + 
        ex.GetType().ToString() + "Exception Messsage: " + ex.Message);              
    }
}

我知道如果我尝试在 sql 中手动插入一个项目,并且在特定列中有重复项,我会从 sql 中收到以下错误:

无法在具有唯一索引“idx_PartnerId_notnull”的对象“dbo.MyTable”中插入重复的键行。重复键值为 (7b072640-ca81-4513-a425-02bb3394dfad)。

如何以编程方式专门捕获此异常,以便对其采取行动。

这是我对专栏的约束:

CREATE UNIQUE NONCLUSTERED INDEX idx_yourcolumn_notnull
ON YourTable(yourcolumn)
WHERE yourcolumn IS NOT NULL;

【问题讨论】:

    标签: c# asp.net sql entity-framework


    【解决方案1】:

    试试这个:

    try {
    }
    catch (SqlException sqlEx) {
    }
    catch (Exception ex) {
    }
    

    发生在服务器端的 SQL 错误和警告会在此异常中捕获。 在这里阅读: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception(v=vs.110).aspx

    上述答案将允许您捕获 SqlException,但如果您只想通知用户特定错误,则需要进一步改进“SqlException”捕获块中的处理。 SqlException 类具有“ErrorCode”属性,您可以从中派生服务器产生的实际错误。尝试执行以下操作:

    try 
    {
    }
    catch (SqlException sqlEx) 
    {
       if(sqlEx.ErrorCode == 2601)
       {
          handleDuplicateKeyException();
       }
    }
    

    2601 是 SQL Server 为您的特定错误生成的实际错误代码。如需完整列表,只需运行 SQL:

    SELECT * FROM sys.messages

    【讨论】:

      【解决方案2】:

      使用 SqlException 的 number 属性。

      对于重复错误,数字是 2601。

      catch (SqlException e) 
      { 
         switch (e.Number) 
         { 
            case 2601: 
               // Do something. 
               break; 
            default: 
               throw; 
         } 
       } 
      

      错误代码列表

       SELECT * FROM sysmessages 
      

      【讨论】:

        【解决方案3】:

        你可以通过它的类型来捕捉它:

                try
                {
                    // ...
                }
                catch (SpecialException ex)
                {
                }
                catch (Exception ex)
                {
                }
        

        编辑:根据 Ivan G 的回答,您将得到一个 SqlException,其中有一个可能是特定的错误 ErrorCode 属性。所以你必须检查这种类型的错误的错误代码。

        【讨论】:

        • 对不起,你能说得更详细一点吗?根据错误,我会使用哪种类型?从那里你能举个例子吗?谢谢!!
        • 你得到什么样的异常?我不知道,如果是“DuplicateKeyException”(可能不是:)),你可以准备你的代码先捕获那种异常。
        【解决方案4】:

        当异常被抛出时,你可以检查异常文本或其他参数,这样你就可以有条件地表现得像你一样

        喜欢:

        catch(SqlException ex)
        {
            if(ex.Message.Contains("Cannot insert duplicate key row in object"))
           {
        
           } 
        }
        

        或异常编号,如

        catch(SqlException ex)
        {
        switch (ex.Number)
        {
        case : someNumber:
        {
        //..do something
        break...;
        }
        }
        }
        

        【讨论】:

          猜你喜欢
          • 2022-01-12
          • 1970-01-01
          • 1970-01-01
          • 2021-04-23
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多