.NET Core 3.0中的數據庫驅動框架System.Data

雖然沒有得到很多關注,但System.Data對於.NET中任何關係型數據庫的訪問都至關重要。因爲其前身是ActiveX Data Objects,所以它也被稱爲ADO.NET。System.Data提供了一個通用框架,是構建.NET數據庫驅動程序的基礎。該框架提供了數據庫驅動可以遵循的具體規範。

連接、命令和數據讀取器都基於雙重繼承模式。它們分別從DbConnection、DbCommand和DbDataReader繼承了一些基本功能。它們還實現了抽象接口IDbConnection、IDbCommand和IDbDataReader,這些接口可以模擬場景和非傳統數據源。這種雙重繼承模式也適用於下面描述的所有基類。

雖然連接字符串通常被視爲字符串,但有一些工具可以將它們表示爲從DbConnectionStringBuilder繼承的對象。這可以處理特定數據庫的連接字符串解析,並使開發人員可以更好地瞭解特定數據庫提供的設置。

System.Data早於ORMs for .NET,但它確實提供了一種通過實現DbDataAdapter和DbCommandBuilder類生成SQL的通用方法。這既可以直接使用,也可以與普通數據集和類型化數據集結合使用。

如果你正在尋找抽象工廠模式的真實示例,請查看DbProviderFactory。它的子類提供了連接、命令、命令參數、命令構建器和數據適配器。基本上是數據訪問所需的一切,而不需要特定於數據庫的邏輯。

接口的問題

如上所述,System.Data依賴於雙重繼承。在添加新方法時,這可能是一個問題。例如,.NET 4.5中的DbCommand增加了異步操作。但是,它們無法添加到相應的IDbCommand接口中,因爲這將是一個破壞性更改。這意味着你不能同時使用異步操作和容易模擬的抽象接口。

微軟本可以在.NET Core 1.0中一次性重置抽象接口,使其與抽象類相匹配(Java過去在JDBC接口中就這樣做過)。然而,這會使與.NET Framework共享代碼變得困難。

如果C# 8中包含默認接口方法,那麼理論上可以使用它們以向後兼容的方式重新組合接口。但是,由於默認接口方法是.NET Core纔有的特性,所以它與.NET Framework不兼容,也就不能用於舊的編譯器和其他.NET語言

DbDataReader.Get()字符串重載 #31595*

.NET Core 3.0的第一個特性是能夠將列名傳遞給DbDataReader.GetXXX方法。長期以來,人們一直抱怨這個接口不能按名稱引用列。這意味着你需要使用下面這個模式:

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

顯然(對有些人來說,早就該這樣了),簡化方式是提供一個字符串重載( string overload):

reader.GetInt32("columnName")

Oracle的Connector/NET和MySqlConnector已經這樣做了。

因爲性能原因,這個新方法不會被標記爲virtual,從而使JIT編譯器可以輕鬆地將它內聯。由於上述原因,新的方法集不會添加到IDbDataReader中。

XmlDataDocument #33442

如果你瞭解XmlDataDocument的歷史,那麼這似乎是一個奇怪的選擇。自從.NET 4.0在2010年發佈以來,它就已經被標記爲過時,並警告說“XmlDataDocument類將在未來的版本中被刪除”。

現在重新開始使用它的原因是一些WinForms和WPF應用程序在使用它。Bug報告顯示,“它在Apiport的不同類別中有1-7%的使用率。”

DatasetExtensions

.NET Core 3中沒有的一個特性是DataTableExtensions類。雖然看起來非常簡單,只有6個擴展方法,但是如果不修改System.Data本身,就無法構建AsDataView。原因相當複雜,涉及內部方法、類型轉發和.NET標準帶來的挑戰。

如果你感興趣,可以看下相關的話題,包括“將DatasetExtensions移植到.NET Core #19771”、“移植DataTable.AsDataView擴展方法 #27610”和“公開涉及在DataView中進行鍵搜索的內部虛擬方法 #31764”。

查看英文原文:System.Data in .NET Core 3.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章