2013-03-05 33 views

回答

47

如果你抓到SqlException然後看到它的號碼,數字2627將意味着違反唯一約束(包括主鍵)。

try 
{ 
    // insertion code 
} 
catch (SqlException ex) 
{ 
    if (ex.Number == 2627) 
    { 
     //Violation of primary key. Handle Exception 
    } 
    else throw; 
} 

MSSQL_ENG002627

這是可以不管的 數據庫是否被複制被提出了一般性錯誤。在複製數據庫中,通常會引發錯誤 ,因爲在整個拓撲中主鍵沒有得到適當的管理

+3

@Roshan如果你同時使用它們,你必須使用'SqlException'而不是'System.Exception',確保更具體的異常有它的catch塊在不太特定的異常之上(在這種情況下catch塊'SqlException '必須在'Exception'的catch塊之上)。 – 2013-03-05 07:20:02

+3

我相信2601也可以是唯一索引違反 – Brain2000 2015-07-14 16:06:45

+1

還值得注意的是,這樣你就結束了,你可以使用異常過濾: '嘗試{// 插入代碼 } 趕上(SQLEXCEPTION前)時(ex.Number = = 2627){ //做某事 }' – MJJames 2016-10-26 10:51:33

0

在實體框架的情況下,接受的答案將不起作用,並且錯誤最終不會被捕獲。下面是測試代碼,如果實體聲明僅除去實體catch語句將受到打擊或課程的一般異常:

try 
{ 
    db.InsertProcedureCall(id); 
} 
catch (SqlException e0) 
{ 
    // Won't catch 
} 
catch (EntityCommandExecutionException e1) 
{ 
    // Will catch 
    var se = e1.InnerException as SqlException; 
    var code = se.Number; 
} 
catch (Exception e2) 
{ 
    // if the Entity catch is removed, this will work too 
    var se = e2.InnerException as SqlException; 
    var code = se.Number; 
} 
1

這是一個古老的線程,但我想這是值得一提的是,由於C#6你可以:

try 
{ 
    await command.ExecuteNonQueryAsync(cancellation); 
} 
catch (SqlException ex) when (ex.Number == 2627) 
{ 
    // Handle unique key violation 
} 

並與C#7和包裹除外(例如實體框架核心):

try 
{ 
    await _context.SaveChangesAsync(cancellation); 
} 
catch (DbUpdateException ex) 
    when ((ex.InnerException as SqlException)?.Number == 2627) 
{ 
    // Handle unique key violation 
} 

與接受的答案比較,這種方法的最大優點是:

如果錯誤編號爲而不是等於2627並且因此它不是唯一的密鑰違規,則不會捕獲異常。

如果沒有異常過濾器(when),最好記得重新拋出異常,以防萬一您無法處理它。理想情況下不要忘記使用ExceptionDispatchInfo,以便原始堆棧不會丟失。