4

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

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;
4

4 回答 4

7

试试这个:

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

于 2012-09-28T07:39:27.320 回答
2

使用 SqlException 的 number 属性。

对于重复错误,编号为 2601。

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

错误代码列表

 SELECT * FROM sysmessages 
于 2012-09-28T07:46:43.507 回答
0

您可以按其类型捕获它:

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

编辑:根据 Ivan G 的回答,你会得到一个,它有一个可能是特定SqlException的错误ErrorCode属性。因此,您必须检查此类错误的错误代码。

于 2012-09-28T07:35:28.640 回答
0

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

像 :

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...;
}
}
}
于 2012-09-28T07:51:19.400 回答