System.Data.SQLite与Microsoft.Data.Sqlite的比较

43

System.Data.SQLite 和 Microsoft.Data.Sqlite 之间有什么区别?

我了解到 System.Data.SQLite 是旧版本,后来在 Microsoft.Data.Sqlite 之后支持了 .NETStandard,但现在两者都支持 .NETStandard 2。

它们之间的优势是什么?


1
深入比较:https://learn.microsoft.com/zh-cn/dotnet/standard/data/sqlite/compare - Giorgi Chakhidze
4个回答

35
System.Data.SQLite 的一个优点是它由 SQLite 团队开发,这个团队已经表示长期承诺支持它。
Microsoft.Data.Sqlite 的一个优点是它由 Microsoft 开发,并且可以假定它已经通过了 Entitity Framework、.NET Core 等进行了充分测试。
我选择 System.Data.SQLite 用于我的项目,其中一个原因是我使用 GetBytes() DataReader 方法,而这个方法在 Microsoft.Data.Sqlite 中“不受支持”。
我没有测试性能,但如果 Microsoft.Data.Sqlite 获胜,也不会让我感到惊讶,因为它声称是一个更轻量级的封装器。请参见下面的说明。
这里有一个信息性评论,是 Microsoft.Data.Sqlite 的开发人员之一 Brice Lambson 在这里发表的:https://www.bricelam.net/2018/05/24/microsoft-data-sqlite-2-1.html#comment-3980760585 他说:
“Microsoft.Data.Sqlite 与 System.Data.SQLite 有三个主要区别。
“首先,我们不旨在成为功能完整的 ADO.NET 提供程序。Microsoft.Data.Sqlite 是为 .NET Core 1.0 创建的,当时的目标是创建一个更轻量级、现代化的 .NET 版本。然而,.NET Core 的目标已经在很大程度上被放弃,转而采用尽可能多的 API,以使从其他 .NET 运行时移植更容易。但是,微软仍然只想提供一个 SQLite 数据库的低级访问接口。
“其次,Microsoft.Data.Sqlite 与 System.Data.SQLite 的设计方式不同。我们的目标是尽量减少对 SQLite 核心库的依赖,因此内部实现了自己的操作系统调用层。这样可以提高性能并降低代码大小。System.Data.SQLite 则更倾向于直接使用核心库,因此可以支持更多的功能。
“最后,Microsoft.Data.Sqlite 与 System.Data.SQLite 的授权方式不同。Microsoft.Data.Sqlite 使用 MIT 许可证,可以免费商用、修改和分发。System.Data.SQLite 使用双重许可证(开源/商业),有一些限制。”基本的 ADO.NET 实现足以支持现代数据访问框架,如 EF Core、Dapper 等。我们倾向于不添加可以使用 SQL 完成的功能的 API。例如,请参阅此评论以了解与连接字符串关键字的 SQL 替代方法。
“第二个重大区别是我们更接近于本地 SQLite 行为。我们不试图补偿任何 SQLite 的怪异行为。例如,System.Data.SQLite 在列类型名称中添加了 .NET 语义。他们甚至不得不解析每个 SQL 语句,然后将其发送到本地驱动程序来处理自定义 SQL 语句,以指定不直接来自表列(即 SELECT 子句中的表达式)的结果的列类型。相反,我们接受 SQLite 只支持四种原始类型(INTEGER、REAL、TEXT 和 BLOB)的事实,并以帮助您在这些类型之间强制转换值和 .NET 类型的方式实现 ADO.NET API。
“最后,我们不是十年前编写的。 :-) 这使我们能够创建更现代的 API,在现代惯用的 C# 中感觉更自然。注册用户定义函数的 API 是最好的例子。”

14

我在一个项目中尝试了System.Data.SQLite 和 Microsoft.Data.SQLite,并进行了真实世界的性能测试,结果表明当批量插入数据时,System.Data.SQLite比Microsoft.Data.Sqlite快3倍。


1
我发现只要将 Microsoft.Data.SQLite 替换为 System.Data.SQLite,我的常规查询总和语句速度也提高了约 3 倍。 - Jon

6

其他关键点

  • Microsoft.Data.SQLite 在 .NET 运行时中也没有本地支持,因此在这里没有优势。您仍然需要将其他 .dll 文件附加到项目中(MS 的版本需要更多)。
  • System.Data.SQLite 来自 sqlite.org,更新更快,有真正的 Standard 2.1 版本,而 Microsoft.Data.SQLite 目前仍然是 Standard 2.0(截至2022年9月)。
  • System.Data.SQLite 依赖性更少,只需 MS Visual C++ Redistributable。而 Microsoft.Data.SQLite 则取决于 SQLitePCLRaw.coreMicrosoft.Data.Sqlite.Core
    如果您喜欢手动管理依赖项,即不使用 nuget 自动安装/更新,则使用 MS 版本会更加复杂。

更新:
关于 SQLite,我让它听起来比实际上容易些,我花了一些时间才弄清楚要使用哪个 SQLite 包。 但是,要手动管理这两个 dll,您可以获取包Stub.System.Data.SQLite.Core.NetStandard,提取它(例如 7z),并引用托管的System.Data.SQLite.dll,然后将未托管(本地)的 SQLite.Interop.dll 附加上去。


4

还有一个发现,截至今天(2020年3月6日),System.Data.SQLite没有为Linux ARM提供编译好的二进制文件。您需要 手动 处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接