從 System.Data.SqlClient 遷移到 Microsoft。Data.SqlClient

Microsoft。Data.SqlClient 是支援 .NET 應用程式中新增 SQL Server 功能的提供者。 它保留了 System.Data.SqlClient所使用的 ADO.NET 程式設計模型,但在套件、命名空間、預設值及部分公開型別上有所不同。

把遷移當作提供者更新,而不只是命名空間的替換。

規劃移轉

在更改程式碼前:

  1. 記錄該應用程式支援的 .NET、System.Data.SqlClientSQL Server 及 Microsoft SQL 服務版本。

  2. 庫存驗證模式、連接字串 關鍵字、自訂憑證、Always Encrypted 提供者、DbProviderFactories設定、SQL Server 使用者定義型別及System.Data.SqlTypes使用情況。

  3. 執行應用程式目前的測試,並儲存連線、查詢、交易、重試及效能行為的基準。

  4. 搜尋直接和傳遞性套件參考:

    dotnet list package --include-transitive
    

一次遷移一個應用程式或共享資料存取函式庫。 不要在仍使用 System.Data.SqlClient 的程式碼與使用 Microsoft.Data.SqlClient的程式碼之間傳遞提供者專用物件。

更換包裹

若有明確的 System.Data.SqlClient 套件參考,請將其移除:

dotnet remove package System.Data.SqlClient

新增 Microsoft。Data.SqlClient:

dotnet add package Microsoft.Data.SqlClient

如果 Microsoft.Data.SqlClient 7.0 或更新版本使用驅動程式提供的 Microsoft Entra 認證模式,也可新增:

dotnet add package Microsoft.Data.SqlClient.Extensions.Azure --version <same-version-as-Microsoft.Data.SqlClient>

關於版本與套件選擇,請參見安裝、更新與部署 Microsoft。Data.SqlClient

更新命名空間

替換主要提供者命名空間:

-using System.Data.SqlClient;
+using Microsoft.Data.SqlClient;

更新完全限定的名稱、別名、產生的程式碼、相依注入註冊、反射字串、配置,以及參考 System.Data.SqlClient的測試雙重。

不要取代一般的 System.DataSystem.Data.Common 命名空間。 Microsoft.Data.SqlClient 繼續使用來自這些命名空間的 ADO.NET 類型,例如 CommandTypeDbTypeDbConnectionIsolationLevelDataTableDbCommand

某些 SQL Server 專屬的命名空間類型會移動到其他Microsoft.Data命名空間:

類型 先前的命名空間 Microsoft.Data.SqlClient 命名空間
SqlDataRecordSqlMetaData Microsoft.SqlServer.Server Microsoft.Data.SqlClient.Server
SqlFileStream System.Data.SqlTypes Microsoft.Data.SqlTypes
SqlNotificationRequest System.Data.Sql Microsoft.Data.Sql
OperationAbortedException System.Data Microsoft.Data

Microsoft.Data.SqlClient 5.0 及以後版本中,其他 SQL Server 通用語言執行時(CLR)類型仍保留在 Microsoft.SqlServer.Server。 根據編譯器錯誤和 Microsoft.Data.SqlClient API 參考文件 更新每個型別,而不是取代整個命名空間。

更新 .NET Framework 設定

透過 DbProviderFactories 解析提供者的應用程式,可能需要在 App.configWeb.config 中註冊提供者:

<configuration>
  <system.data>
    <DbProviderFactories>
      <add name="SqlClient Data Provider"
           invariant="Microsoft.Data.SqlClient"
           description=".NET data provider for SQL Server"
           type="Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient" />
    </DbProviderFactories>
  </system.data>
</configuration>

更新請求提供者不變名稱的程式碼:

DbProviderFactory factory =
    DbProviderFactories.GetFactory("Microsoft.Data.SqlClient");

當應用程式直接建立 SqlConnection 且不使用 DbProviderFactories時,不要新增這個設定。

檢視加密與憑證驗證

Microsoft。Data.SqlClient 使用比 System.Data.SqlClient 更安全的預設值。

行為 System.Data.SqlClient Microsoft.Data.SqlClient
預設加密 Encrypt=false Encrypt=true 從 4.0 版本開始
伺服器憑證驗證 只有在啟用用戶端加密時才驗證憑證 從 2.0 版開始,當伺服器強制加密時,會根據 TrustServerCertificate 驗證憑證,即使 Encrypt=false
嚴格加密 不支援 Encrypt=Strict 自 5.0 版起,適用於支援 TDS 8.0 的伺服器
SqlConnectionStringBuilder.Encrypt 類型 bool SqlConnectionEncryptOption 從 5.0 版本開始

不要將 Encrypt=falseTrustServerCertificate=true 設為通用的遷移修正方式。 設定一個客戶端信任的憑證,並使用與該憑證相符的伺服器名稱。 僅在無法進行驗證的受控開發環境中使用 TrustServerCertificate=true

這個 SqlConnectionEncryptOption 變更在常見指派中透過隱式轉換與原始碼相容,但這是二元破壞性的變更。 重新編譯所有會存取 SqlConnectionStringBuilder.Encrypt 的組件。

如需詳細資訊,請參閱加密和憑證驗證

檢閱連接字串

Microsoft。Data.SqlClient 會加入 System.Data.SqlClient 無法辨識的關鍵字和別名。 例如,它接受包含空格的別名,例如 Application IntentMulti Subnet Failover

不要用 Microsoft.Data.SqlClient.SqlConnectionStringBuilder 建立連線字串,然後再將它傳給 System.Data.SqlClient。 在分階段遷移過程中,請讓每個連線字串建構器都與其提供者配對使用。

對照 連接字串語法,檢閱驗證、加密、重試、容錯移轉和憑證關鍵字。

檢視參數行為

測試日期與時間參數明確說明:

參數 System.Data.SqlClient 行為 Microsoft.Data.SqlClient 行為
DbType.Time值為DateTime 接受該值 使用一個 TimeSpan 數值
DbType.Date值為DateTime 可以傳送日期和時間成分 截去時間部分

在 SQL Server 類型推論可能改變查詢計畫或轉換行為的參數中,指定 SqlDbType、 長度、精確度與縮放。 當資料庫類型已知時,不要把 AddWithValue 它當作遷移捷徑。

檢查傳遞性提供者參照

直接移除套件並不能保證 System.Data.SqlClient 已消失。 跑步:

dotnet list package --include-transitive

如果兩個供應商都繼續存在:

  1. 找出引入 System.Data.SqlClient 的套件。
  2. 如果可能,更新或替換那個依賴。
  3. 當兩者都必須保留時,請將特定提供者的型別保留在依賴邊界內。
  4. 僅將明確的命名空間別名作為暫時輔助。 不要將連線、交易、參數或讀取器從一個提供者傳遞給另一個提供者。

特別要注意 SQL Server 的 CLR 類型函式庫,以及在公開 API 中暴露System.Data.SqlClient型態的舊資料存取框架。

回顧全球化行為

.NET Framework 及 .NET 5 之前的 .NET 版本在 Windows 上採用國家語言支援(NLS)全球化。 目前的 .NET 版本預設使用 Unicode 國際元件(ICU),適用於 Windows、Linux 和 macOS。

這種執行階段差異可能會改變某些 SqlString 比較的結果。 SQL Server 使用 NLS 比較行為。 如果用戶端 SqlString 比較必須符合伺服器端的行為,請測試受影響的值,並參閱 全球化與 ICU。 應用程式在需要時 可使用 NLS 取代 ICU

Microsoft.Data.SqlClient 不支援全球化不變模式。

驗證遷移後的應用程式

在每個支援的目標框架和作業系統上建置並測試。

驗證:

  • 套件還原並發佈輸出。
  • SQL 認證、Windows 整合認證,以及應用程式使用的 Microsoft Entra 認證。
  • TLS 協商、憑證驗證與 連接字串 解析。
  • 連線集區與存取權杖重新整理。
  • 參數類型、空值、精確度、縮放、日期和時間行為。
  • 交易、取消、超時、重試和故障轉移。
  • Always Encrypted、SQL Server CLR 類型、批量複製、查詢通知,以及應用程式使用的其他提供者專屬功能。
  • 日誌記錄、計數器、追蹤和異常處理。

對每個支援的資料庫引擎版本執行代表性查詢。 成功的編譯並不代表驗證連線安全性、執行時相依性或資料轉換。