System.Data.SQLite 的比較
2005年,羅伯特·辛普森建立了 System.Data.SQLite,這是 ADO.NET 2.0 的 SQLite 提供者。 2010年,SQLite 小組接管了該專案的維護和開發。 值得注意的是,Mono 小組在 2007 年將程式碼分支為 Mono.Data.Sqlite。 System.Data.SQLite 具有悠久的歷史,且已演變為具有 Visual Studio 工具的穩定且功能完整的 ADO.NET 提供者。 新版本會繼續發佈與所有版本的 .NET Framework(從 2.0 版起)以及 .NET Compact Framework 3.5 版相容的元件。
.NET Core 的第一個版本(於 2016 年發行)是 .NET 的單一、輕量型、現代化和跨平台實作。 已刻意移除具有更現代化替代方案的過時 API 和 API。 ADO.NET 不包含任何 DataSet API(包括 DataTable 和 DataAdapter)。
Entity Framework 小組對 System.Data.SQLite 程式代碼基底有些熟悉。 前 EF 小組成員 Brice Lambson 先前曾協助 SQLite 小組新增 Entity Framework 第 5 版和 6 版的支援。 Brice 也在嘗試自己開發一個 SQLite 的 ADO.NET 提供者,這大約與 .NET Core 的規劃同時進行。 經過長時間的討論,Entity Framework 小組決定根據 Brice 的原型建立 Microsoft.Data.Sqlite。 這可讓他們建立新的輕量型新式實作,以符合 .NET Core 的目標。
以下是在 System.Data.SQLite 和 Microsoft.Data.Sqlite 中建立 使用者定義 函數的程式代碼範例。
// System.Data.SQLite
connection.BindFunction(
new SQLiteFunctionAttribute("ceiling", 1, FunctionType.Scalar),
(Func<object[], object>)((object[] args) => Math.Ceiling((double)((object[])args[1])[0])),
null);
// Microsoft.Data.Sqlite
connection.CreateFunction(
"ceiling",
(double arg) => Math.Ceiling(arg));
2017年,.NET Core 2.0 經歷了策略的變更。 決定與 .NET Framework 的相容性對於 .NET Core 的成功至關重要。 許多已移除的 API,包括 DataSet API,都已加回。 就如同對許多其他專案的情況一樣,這次的解除封鎖使得 System.Data.SQLite 也可以被移植到 .NET Core。 然而,Microsoft.Data.Sqlite 的輕量和現代化的原始目標仍然不變。 如需Microsoft.Data.Sqlite 未實作之 ADO.NET API 的詳細資訊,請參閱 ADO.NET 限制。
將新功能新增至 Microsoft.Data.Sqlite 時,系統會考慮 System.Data.SQLite 的設計。 我們儘可能嘗試將兩者之間的變更降到最低,以簡化兩者之間的轉換。
數據類型
Microsoft.Data.Sqlite 和 System.Data.SQLite 之間的最大差異在於數據類型的處理方式。 如 數據類型所述,Microsoft.Data.Sqlite 不會嘗試隱藏 SQLite 的基礎怪異性,這可讓任何任意字串指定為數據行類型,而且只有四個基本類型:INTEGER、REAL、TEXT 和 BLOB。
System.Data.SQLite 會將額外的語意套用至數據行類型,並將其直接對應為 .NET 類型。 這讓提供者有更強型別的感覺,但它有一些粗糙的邊緣。 例如,他們必須引進新的 SQL 語句(TYPES),以在 SELECT 語句中指定表示式的數據行類型。
連接字串
Microsoft.Data.Sqlite 的 連接字串 關鍵詞少得多。 下表顯示可改用的替代方案。
關鍵詞 | 替代選項 |
---|---|
快取大小 | 傳送 PRAGMA cache_size = <pages> |
FailIfMissing(若缺失則失敗) | 使用 Mode=ReadWrite |
FullUri | 使用數據源關鍵詞 |
日誌模式 | 傳送 PRAGMA journal_mode = <mode> |
舊版格式 | 傳送 PRAGMA legacy_file_format = 1 |
頁數上限 | 傳送 PRAGMA max_page_count = <pages> |
頁面大小 | 傳送 PRAGMA page_size = <bytes> |
唯讀 | 使用 Mode=ReadOnly |
同步 | 傳送 PRAGMA synchronous = <mode> |
URI | 使用數據源關鍵詞 |
UseUTF16Encoding | 傳送 PRAGMA encoding = 'UTF-16' |
授權
Microsoft.Data.Sqlite 沒有任何 API 公開 SQLite 的授權回呼。 使用問題 #13835 提供此功能的意見反應。
數據變更通知
Microsoft.Data.Sqlite 沒有任何 API 公開 SQLite 的數據變更通知。 使用問題 #13827 來提供此功能的意見反應。
虛擬數據表模組
Microsoft.Data.Sqlite 沒有任何 API 可建立虛擬數據表模組。 使用問題 #13823 來提供此功能的意見反應。