0

我在数据库中有一个包含应用程序用户的表。用户名是唯一的,所以我在表中有唯一的约束。

我正在做探测,一个是尝试为两个用户使用相同的用户名。发生错误时,我捕获异常“Eception”,我可以看到捕获的异常是 System.Data.Entity.Infraestructure.DbUpdateConcurrencyException,内部异常是 System.Data.OptimisticConcurrencyException。

然后我捕获了 DbUpdateConcurrencyException,内部异常是 OptimisticConcurrencyException,所以我也尝试捕获这个异常。

如果我尝试在 DbUpdateConcurrencyException 之前捕获 OptimisticConcurrencyException,则不是捕获,而是捕获 DbUpdateConcurrencyException。

所以我不知道如何捕获 SqlException,因为我想捕获 Sql Server 的错误,以获取代码。

谢谢。

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 回答