前幾天踩到
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.
.NET 8 之路 - System.Data.SqlClient 轉移 Microsoft.Data.SqlClient 經驗一則
非常感謝暗黑大的分享,今天升級就遇到「 憑證鏈結是由不受信任的授權單位所發行」的問題,謝謝暗黑大,提...
2023-12-18 David
.NET 8 之路 - System.Data.SqlClient 轉移 Microsoft.Data.SqlClient 經驗一則
感謝大大分享
2023-12-18 小黑
.NET 8 之路 - System.Data.SqlClient 轉移 Microsoft.Data.SqlClient 經驗一則
2023-12-16 Joker
.NET 8 之路 - System.Data.SqlClient 轉移 Microsoft.Data.SqlClient 經驗一則
感謝大大分享