簡體   English   中英

實體框架4.4:如何捕獲Sql異常?

[英]entity framework 4.4: how to catch the Sql Exception?

我在數據庫中有一個表,其中包含應用程序的用戶。 用戶名是唯一的,因此我在表中有一個唯一的約束。

我正在做探測,一個嘗試為兩個用戶使用相同的用戶名。 當錯誤發生時,我捕獲異常“Eception”,我可以看到catched異常是System.Data.Entity.Infraestructure.DbUpdateConcurrencyException,內部異常是System.Data.OptimisticConcurrencyException。

然后我捕獲了DbUpdateConcurrencyException,這是一個無關的異常是OptimisticConcurrencyException,所以我也嘗試捕獲這個異常。

如果我嘗試在DbUpdateConcurrencyException之前捕獲OptimisticConcurrencyException,而不是catch,則捕獲DbUpdateConcurrencyException。

所以我不知道如何捕獲SqlException,因為我想捕獲Sql Server的錯誤,以獲取代碼。

謝謝。

你有沒有嘗試過:

   try
   {

   }
   catch (SqlException ex)
   {

   }

你無法處理'內部例外'。 您需要檢查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,...)來完成此操作

你可以處理它使用

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));
       }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM