據我了解,微軟在2019 年左右創建了 Microsoft.Data.SqlClient作為 System.Data.SqlClient 的替代品。System.Data.SqlClient 將得到持續支持,但新的開發和功能都將在 Microsoft.Data.SqlClient 中。這兩個庫都有一個名為“SqlException”的類。
假設我在任何地方都使用 Microsoft.Data.SqlClient 那么大概相關的例外將是 Microsoft.Data.SqlClient.SqlException 型別,但我使用了一堆 3rd-party 庫,我怎么能確定它們是否會引發 aa Microsoft .Data.SqlClient.SqlException還是System.Data.SqlClient.SqlException?這是否意味著在某些情況下,我有 Microsoft.Data.SqlClient.SqlException 的捕獲處理程式,我還應該檢查 System.Data.SqlClient.SqlException?或者是否發生了一些聰明的事情,這意味著我只需要考慮 Microsoft.Data.SqlClient.SqlException?
例如,我有一些舊代碼,有點像我在下面顯示的那樣,是在我們開始使用 Microsoft.Data.SqlClient 之前撰寫的。我擔心如果我只是將它更改為使用 Microsoft.Data.SqlClient 那么將會有一些 System.Data.SqlClient.SqlException 例外并且我的代碼將不再注意到它們。
private static bool HandleSqlExceptionInSomeWay(Exception ex)
{
var se = ex as System.Data.SqlClient.SqlException;
if (se != null)
{
// ... do something with the SqlException
return true;
}
return false;
}
所以我應該把它改成這樣的,即分別檢查不同的型別嗎?
private static bool HandleSqlExceptionInSomeWay(Exception ex)
{
// handle old SqlExceptions (e.g. from any old
// libraries not using MS package yet)
var se1 = ex as System.Data.SqlClient.SqlException;
if (se1 != null)
{
// ... do something with the SqlException ...
return true;
}
// handle shiny new SqlExceptions
var se2 = ex as Microsoft.Data.SqlClient.SqlException;
if (se2 != null)
{
// ... do something with the SqlException ...
return true;
}
return false;
}
uj5u.com熱心網友回復:
這兩個類是不同的,但它們確實從同一個基類DbException 繼承。這是所有資料庫例外的公共類,但不會具有兩個派生類中的所有屬性
你應該檢查你使用的庫/NuGet 包,并確保你使用支持新 Microsoft.Data.SqlClient 庫的版本。混合資料提供者并不有趣,應盡可能避免。大多數流行的 NuGet 包已經使用 Microsoft.Data.SqlClient。
如果您不能這樣做,則選項取決于您實際處理資料庫例外的方式。您是否檢查 SQL Server 特定的屬性?
另一種選擇是推遲升級,直到所有 NuGet 包也都升級了。這兩個庫都包含需要在部署期間包含的本機 DLL。如果混合庫,則必須包含所有本機 DLL。
這可能會很痛苦。
uj5u.com熱心網友回復:
如果您不能確定第三方庫是使用Microsoft還是System庫,您需要同時處理這兩者。沒有“魔法醬”可以將SqlException一個庫中的 a轉換為另一個庫中的 a SqlException。
uj5u.com熱心網友回復:
為了擴展理查德的回答,這意味著你的 try/catch 最終看起來像:
try{
//boom
} catch(Microsoft.Data.SqlClient.SqlException ex){
Handler(ex);
} catch (System.Data.SqlClient.SqlException ex) {
Handler(ex);
}
如果你想同時處理..
處理程式是一些可訪問的多載(或父型別引數)方法,處理每種型別。可以改為捕獲(然后在需要時檢查例外型別)。
編輯; 完全忘記了catch when哪個對最后一種情況有用,謝謝@Heinzi
try{
//boom
} catch (DbException ex)
when (ex is Microsoft.Data.SqlClient.SqlException || ex is System.Data.SqlClient.SqlException)
{
//handle
}
你也可以在這個中使用別名is(也結合了卡米洛關于使用別名的型別的建議using)
when (ex is NewSqlException nsx || ex is OldSqlException osx){
if(nsx.Number ...)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/356559.html
標籤:C# sql-server
