2013-03-05 14 views
15

私たちはC#でSQL Serverエラーコードから主キーの重複エラーを識別する方法を知りたいです。データエントリは、どのように私は例外からエラーの原因を特定することができます中にエラーが発生した場合の例としてSQL Server 2008のエラーコードから主キーの重複を特定する方法はありますか?

、私は、SQL Serverデータベースにデータを入力するためのC#のフォームを持っていますか?

答えて

47

SqlExceptionを捕まえた場合、番号2627は一意性制約(主キーを含む)に違反することを意味します。

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

MSSQL_ENG002627

これは関係なく データベースが複製されるかどうかに上昇させることができる一般的なエラーです。レプリケートされたデータベースでは、エラーは主キーが適切にトポロジ全体を管理されていないため は、一般的に上げています。

+3

あなたは 'SqlException'、ない' System.Exception'を使用する必要が@Roshanあなたがそれらの両方を使用する場合、より具体的な例外は 'のSQLExceptionこの場合、catchブロックで(以下、特定の例外の上にそのcatchブロックを持っていることを確認してください'Exception'のキャッチブロックを上回らなければなりません)。 –

+3

私は2601年もまた、あなたがで終わるように、あなたは例外フィルタを使用できることは注目に値するユニークなインデックス違反 – Brain2000

+1

ことができると信じて: '試し{ //挿入コード } キャッチ(のSQLException元)とき(ex.Number = = 2627){ //何かを実行 } ' – MJJames

0

Entity Frameworkの場合、受け入れられた応答は機能せず、エラーは捕捉されなくなります。ここでは、テストコードは、エンティティの文が削除された場合のみ、エンティティ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および(Entity Frameworkのコアのような)ラッピングの例外を除いて:

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

受け入れ答えと比較して、このアプローチの最大の利点は次のとおりです。

エラー番号がでない場合、は2627であるため、ユニークなキー違反ではなく、例外は検出されません。

例外フィルタ(when)なしあなたはより良いあなたがそれを扱うことができない場合には、その例外を再スロー覚えたいです。また、元のスタックが失われないように、ExceptionDispatchInfoを使用することを忘れないようにしてください。

関連する問題