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' catch ブロック内の処理をさらに調整する必要があります。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 に答える