0

アプリケーションのユーザーを含むテーブルがデータベースにあります。ユーザー名は一意であるため、テーブルに一意の制約があります。

私はプローブを行っていますが、1つは2人のユーザーに同じユーザー名を使用しようとしています。エラーが発生すると、例外「Eception」がキャッチされ、キャッチされた例外はSystem.Data.Entity.Infraestructure.DbUpdateConcurrencyExceptionであり、内部例外はSystem.Data.OptimisticConcurrencyExceptionであることがわかります。

次に、DbUpdateConcurrencyExceptionをキャッチします。内部例外はOptimisticConcurrencyExceptionであるため、この例外もキャッチしようとします。

DbUpdateConcurrencyExceptionがキャッチされない前にOptimisticConcurrencyExceptionをキャッチしようとすると、DbUpdateConcurrencyExceptionがキャッチされます。

したがって、SQL Serverのエラーをキャッチしてコードを取得したいので、SqlExceptionをキャッチする方法がわかりません。

ありがとう。

4

3 に答える 3

1

やってみました:

   try
   {

   }
   catch (SqlException ex)
   {

   }
于 2012-12-03T10:21:55.850 に答える
1

'内部例外'を処理することはできません。catchハンドラーでスローされた実際の例外を検査し、それを処理できない場合は再処理する必要があります。例:

try
{
}
catch (DbUpdateConcurrencyException ex)
{
   if (CanHandleException(ex)) 
   {
       // do what you have to do to handle the exception
   }
   else
   {
       throw; // can't handle this exception - just let it bubble up
   }
}

このメソッドCanHandleExceptionでは、この例外を処理して意味のあることを実行できるかどうかを判断するロジックを記述します(おそらく操作を再試行します)。これを行うには、例外のプロパティ(メッセージ、InnerException、...)を調べます。

于 2012-12-03T10:27:07.447 に答える
0

あなたはそれを使用して処理することができます

var objContext = ((IObjectContextAdapter)ctx).ObjectContext;
     var entry = dbUpdateConcurrencyException.Entries.Single();
     if (entry.State == EntityState.Deleted)
     {
           entry.State = EntityState.Detached;
      }
      else
      {
           entry.OriginalValues.SetValues(entry.GetDatabaseValues());
            objContext.Refresh(RefreshMode.ClientWins,dbUpdateConcurrencyException.Entries.Select(e => e.Entity));
       }
于 2016-02-10T10:50:19.990 に答える