.NET 8 之路 - System.Data.SqlClient 轉移 Microsoft.Data.SqlClient 經驗一則
4 |
前幾天踩到 System.Data.SqlClient 與 .NET 8 不相容的雷,無奈 System.Data.SqlClient 停更已成事實,要繼續往前走,儘早改用 Microsoft.Data.SqlClient 是上策。
咬牙把某個專案的 System.Data.SqlClient 換成 Microsoft.Data.SqlClient,過程還算平和沒動怒 XD,修改處不多,沒遇到刁鑽問題。(轉換順利多少跟專案是用 Dapper 有關,Dapper 封裝了 SqlCommand、SqlParamater、SqlReader 底層操作,而專案也只用到常見的 CRUD 操作)
這篇整理這次轉移涉及的修改,提供有類似需求的同學參考。
- 第一步,專案要參照 Microsoft.Data.SqlClient (以下簡稱 MDS),MDS 5.1 在 .NET 8 用到 Guid 欄位會遇到 SqlGuidCaster 無法載入錯誤,現階段可
dotnet add package Microsoft.Data.SqlClient --prerelease
安裝 MDS 5.2.0-preview 解決。 - Dapper 在 2.0.4 版移除 System.Data.SqlClient 依賴,同時支援 System.Data.SqlClient 及 MDS 參考,故 Dapper 要升級到 2.0.4 以上。
- SqlConnection、SqlCommand、SqlReader、SqlParameter... 等常用型別在 MDS 名稱沒變,故將
using System.Data.SqlClient;
換成using Microsoft.Data.SqlClient;
即可改用 MDS,幸運的話只改這行就完成切換。 - MDS 不再提供 IDbConnection、IDbTransaction 介面,基本上改用 DbConnection、DbTransaction 即可。註:IDb* 介面隸屬 System.Data,Db* 抽象類別隸屬 System.Data.Common,故記得要
using System.Data.Common;
。 - MDS 預設會啟用加密通訊,新版 SQL 大多已支援 TLS 加密,但多半是用自簽憑證,常會遇到
A connection was successfully established with the server, but then an error occured during the login process. (provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted. / 此憑證鏈結是由不受信任的授權單位發出的)
錯誤(參考。我不想為了換 MDS 而修改連線字串,就加了一小段邏輯向前相容。void SetConnectionString(string cnStr) { var scsb = new SqlConnectionStringBuilder(cnStr); // 若連線字串未指定 TrustServerCertificate,設為 true if (!cnStr.Contains("TrustServerCertificate", StringComparison.CurrentCultureIgnoreCase)) { scsb.TrustServerCertificate = true; } _cnStr = scsb.ConnectionString; }
就醬,經過一陣翻修,將 System.Data.SqlClient 換成 Microsoft.Data.SqlClinet,.NET 6 專案終於成功升級成 .NET 8 囉~ (轉圈灑花)
My notes about migrating System.Data.SqlClient to Microsoft.Data.SqlClient.
Comments
# by Joker
感謝大大分享
# by 小黑
感謝黑哥
# by David
感謝大大分享
# by Thomas.wu
非常感謝暗黑大的分享,今天升級就遇到「 憑證鏈結是由不受信任的授權單位所發行」的問題,謝謝暗黑大,提供這麼好的解法,謝謝