我想知道我們如何識別來自C#中的SQL Server錯誤代碼的主鍵重複錯誤。如何識別SQL Server 2008錯誤代碼中的主鍵重複?
作爲一個例子,我有一個C#表單將數據輸入到SQL Server數據庫中,當數據錄入時發生錯誤時,如何從異常中找出錯誤原因?
我想知道我們如何識別來自C#中的SQL Server錯誤代碼的主鍵重複錯誤。如何識別SQL Server 2008錯誤代碼中的主鍵重複?
作爲一個例子,我有一個C#表單將數據輸入到SQL Server數據庫中,當數據錄入時發生錯誤時,如何從異常中找出錯誤原因?
如果你抓到SqlException然後看到它的號碼,數字2627
將意味着違反唯一約束(包括主鍵)。
try
{
// insertion code
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
//Violation of primary key. Handle Exception
}
else throw;
}
這是可以不管的 數據庫是否被複制被提出了一般性錯誤。在複製數據庫中,通常會引發錯誤 ,因爲在整個拓撲中主鍵沒有得到適當的管理。
在實體框架的情況下,接受的答案將不起作用,並且錯誤最終不會被捕獲。下面是測試代碼,如果實體聲明僅除去實體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;
}
這是一個古老的線程,但我想這是值得一提的是,由於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
,以便原始堆棧不會丟失。
@Roshan如果你同時使用它們,你必須使用'SqlException'而不是'System.Exception',確保更具體的異常有它的catch塊在不太特定的異常之上(在這種情況下catch塊'SqlException '必須在'Exception'的catch塊之上)。 – 2013-03-05 07:20:02
我相信2601也可以是唯一索引違反 – Brain2000 2015-07-14 16:06:45
還值得注意的是,這樣你就結束了,你可以使用異常過濾: '嘗試{// 插入代碼 } 趕上(SQLEXCEPTION前)時(ex.Number = = 2627){ //做某事 }' – MJJames 2016-10-26 10:51:33