.NET Core 3.0:System.Data的變化

System.Data雖然不引人關注,但在.NET中,System.Data對於各類關係數據庫的鏈接是很是重要的。System.Data也被成爲ADO.NET,其前身是ActiveX Data Objects。System.Data提供了經過的框架,在她的基礎上.NET數據驅動應用能夠被構建。這個框架還提供了數據驅動程序應遵照的一些約定。git

Connections,commands,data readers都是雙繼承。每一個分別實現了來自於DbConnection, DbCommand,DbDataReader的基礎功能。他們也實現了抽象接口IDbConnection, IDbCommand, 和IDbDataReader,這使得它們可以支持模擬場景和非傳統數據源。在下文描述的基礎類中都基於雙繼承方案。github

雖然,connection strings通常被認爲是字符串,但有些工具卻認爲它是繼承自DbConnectionStringBuilder的對象。它可以處理數據庫鏈接字符串的特定解析並幫助開發人員更好的理解特定數據庫的可用設置。sql

在.NET中System.Data早於ORM框架出現,可是經過實現DbDataAdapter和DbCommandBuilder,它提供了生成sql的通用方法。它能夠被直接使用,也能和普通數據集及類型化數據集組合使用。數據庫

若是你想找到一個抽象工廠模式的例子,你能夠看下DbProviderFactory。它的自雷提供了connections, commands, command parameters, command builders, data adapters。其中包含了你須要的所有關於數據訪問的需求,而不單單是數據庫的邏輯。api

接口的問題框架

在上文中已經提到,System.Data依賴於雙繼承。當咱們想添加新的方法時,這將帶來問題。例如,異步操做被加入到在.NET 4.5的DbCommand之中。可是卻沒法將他們添加到匹配的IDbCommand接口之中,由於這將是一個破壞性的改變。這意味着您不能同時使用異步操做和容易模擬的抽象接口。異步

微軟本能夠在.NET Core 1.0中從新設計抽象接口,以使得其可以與抽象類相匹配(Java經過JDBC的接口已經實現了)。然而,這卻會使得.NET Framework共用源碼變得困難。ide

若是默認接口方法可以出如今C#8.0中,在理論上,這一特徵能夠用來以向後兼容的方式調整接口。可是在.NET Framework中並不兼容,由於默認接口方法只是.NET Core的特徵。它也不能使用較老的編譯器和其餘.NET語言工具

DbDataReader.Get()中的字符串重載性能

咱們對於System.Data在.NET Core 3.0之中的第一個特徵是DbDataReader的Get()方法之中可以傳遞列名。長期以來,人們一直抱怨這個接口不能按名稱引用列。這意味着你須要使用這個模式 。

reader.GetInt32(reader.GetOrdinal("columnName"))

一個明顯的(對某些人來講,也是早就應該有的)簡化方法是提供字符串重載。

reader.GetInt32("columnName")

這已經在Oracle's Connector/NET和MySqlConnector中實現。

處於性能考慮,該方法不會被標記爲虛方法,從而容許JIT編譯器輕鬆地內聯它。也是因爲上述緣由,新的方法集不會添加到IDbDataReader中。

XmlDataDocument

若是你瞭解XmlDataDocument的歷史,這彷佛是一個奇怪的選擇。在2010年發佈的.NET 4.0之中,其已經被標記爲過期的,並提出了XmlDataDocument在將來的版本中將會被刪除的警告。如今使用它的緣由是一些WinForms和WPF應用程序使用它,在bug報告中稱,其在Apiport的各類類別中有1-7%的使用率。

DatasetExtensions

DataTableExtensions在.NET Core 3之中將不在支持。雖然它看起來只是有6個擴展方法的類,可是在不修改System.Data的狀況下,咱們沒法構建AsDataView方法。緣由至關的複雜,涉及內部方法、類型轉發和.NET Standard帶來的挑戰。

若是你感興趣,能夠與咱們聯繫連接2)。

本文翻譯自System.Data in .NET Core 3.0

相關文章
相關標籤/搜索