与 System.Data.SQLite 的比较
2005年,罗伯特·辛普森创建了 System.Data.SQLite,这是 ADO.NET 2.0 的 SQLite 提供程序。 2010 年,SQLite 团队接管了项目的维护和开发。 同样值得注意的是,Mono 团队在 2007 年以 Mono.Data.Sqlite 形式为代码创建了分支。 System.Data.SQLite 具有悠久的历史,并且已演变为一个稳定且功能齐全的 ADO.NET 提供程序,并且具有 Visual Studio 工具。 新版本会继续将与每个版本的 .NET Framework 兼容的程序集传送回版本 2.0,甚至已涉及 .NET Compact Framework 3.5。
.NET Core 的第一个版本(2016 年发布)是 .NET 的单一、轻型、现代和跨平台实现。 有意删除具有更现代替代方法的过时 API 和 API。 ADO.NET 不包含任何数据集 API(包括 DataTable 和 DataAdapter)。
Entity Framework 团队对 System.Data.SQLite 代码库有些熟悉。 前 EF 团队成员 Brice Lambson 以前曾帮助 SQLite 团队添加对 Entity Framework 版本 5 和 6 的支持。 另外,Brice 在规划 .NET Core 的同时,还试验了自己的 SQLite ADO.NET 提供程序实现。 经过长时间的讨论,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(包括数据集 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> |
Legacy Format | 发送 PRAGMA legacy_file_format = 1 |
最大页数 | 发送 PRAGMA max_page_count = <pages> |
页面大小 | 发送 PRAGMA page_size = <bytes> |
只读 | 使用 Mode=ReadOnly |
同步 | 发送 PRAGMA synchronous = <mode> |
Uri | 使用数据源关键字 |
使用UTF16编码 | 发送 PRAGMA encoding = 'UTF-16' |
授权
Microsoft.Data.Sqlite 没有任何 API 公开 SQLite 的授权回调。 请使用问题 #13835 提供有关此功能的反馈。
数据更改通知
Microsoft.Data.Sqlite 没有任何 API 公开 SQLite 的数据更改通知。 使用问题 #13827 来提供有关此功能的反馈。
虚拟表模块
Microsoft.Data.Sqlite 没有任何用于创建虚拟表模块的 API。 请使用问题编号 #13823 来提供有关此功能的反馈。