实体框架4.4:如何捕获Sql异常?

时间:2012-12-03 10:18:30

标签: c# exception exception-handling entity-framework-4.1

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

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

然后我抓住了DbUpdateConcurrencyException,这是一个很好的异常,就是OptimisticConcurrencyException,所以我也尝试捕获这个异常。

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

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

感谢。

3 个答案:

答案 0 :(得分:1)

你试过了吗?

   try
   {

   }
   catch (SqlException ex)
   {

   }

答案 1 :(得分: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中,您将编写逻辑,确定您是否可以处理此异常并执行一些有意义的操作(可能重试该操作)。您可以通过检查异常的属性(message,InnerException,...)

来完成此操作

答案 2 :(得分: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));
       }