Q: 有没有更好的方法来处理SqlExceptions?

以下示例依赖于解释消息中的文本。

Eg1: 如果表不存在,我有一个现有的 try catch 来处理。
忽略我可以首先检查表是否存在的事实。

try
{
    //code
}
catch(SqlException sqlEx)
{
        if (sqlEx.Message.StartsWith("Invalid object name"))
        {
            //code
        }
        else
            throw;
}

Eg2: 没有显示重复键异常的 try catch
if (sqlEx.Message.StartsWith("Cannot insert duplicate key row in object"))

解决方法:我的SqlExceptionHelper 的启动
//-- to see list of error messages: select * from sys.messages where language_id = 1033 order by message_id
public static class SqlExceptionHelper
{
    //-- rule: Add error messages in numeric order and prefix the number above the method

    //-- 208: Invalid object name '%.*ls'.
    public static bool IsInvalidObjectName(SqlException sex)
    { return (sex.Number == 208); }

    //-- 2601: Cannot insert duplicate key row in object '%.*ls' with unique index '%.*ls'. The duplicate key value is %ls.
    public static bool IsDuplicateKey(SqlException sex)
    { return (sex.Number == 2601); }
}

最佳答案

SqlException 有一个 Number property 可以检查。对于重复错误,编号为 2601。

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

要从您的服务器获取所有 SQL 错误的列表,请尝试以下操作:
 SELECT * FROM sysmessages

更新

这现在可以在 C# 6.0 中简化
catch (SqlException e) when (e.Number == 2601)
{
   // Do something.
}

关于c# - 如何捕获特定的 SqlException 错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6221951/

10-17 02:32