System.Data.SQLite との比較Comparison to System.Data.SQLite

2005 年に、Robert Simpson は ADO.NET 2.0 用の SQLite プロバイダーである System.Data.SQLite を作成しました。In 2005, Robert Simpson created System.Data.SQLite, a SQLite provider for ADO.NET 2.0. 2010 年に、SQLite チームがプロジェクトのメンテナンスと開発を引き継ぎました。In 2010, the SQLite team took over maintenance and development of the project. また、2007 年に Mono チームがコードを Mono.Data.Sqlite としてフォークしたことも注目すべき点です。It's also worth noting that the Mono team forked the code in 2007 as Mono.Data.Sqlite. System.Data.SQLite には長い歴史があり、Visual Studio ツールを備えた、安定したフル機能の ADO.NET プロバイダーに進化してきました。System.Data.SQLite has a long history and has evolved into a stable and full-featured ADO.NET provider complete with Visual Studio tooling. 新しいリリースでは引き続き、.NET Framework のすべてのバージョン (バージョン 2.0 や、.NET Compact Framework 3.5 も含む) と互換性のあるアセンブリが提供されています。New releases continue to ship assemblies compatible with every version of .NET Framework back to version 2.0 and even .NET Compact Framework 3.5.

.NET Core の最初のバージョン (2016 年にリリース) は、軽量で最新、かつクロスプラットフォームの .NET の 1 つの実装でした。The first version of .NET Core (released in 2016) was a single, lightweight, modern, and cross-platform implementation of .NET. 古くなった API や、代わりとなる新しいものがある API は、意図的に削除されています。Obsolete APIs and APIs with more modern alternatives were intentionally removed. ADO.NET には DataSet API (DataTable と DataAdapter を含む) は含まれていませんでした。ADO.NET didn't include any of the DataSet APIs (including DataTable and DataAdapter).

Entity Framework チームは、System.Data.SQLite コードベースについてある程度熟知していました。The Entity Framework team was somewhat familiar with the System.Data.SQLite codebase. EF チームのメンバーである Brice Lambson は、過去に SQLite チームが Entity Framework バージョン 5 と 6 のサポートを追加する作業を補助していました。Brice Lambson, a member of the EF team, had previously helped the SQLite team add support for Entity Framework versions 5 and 6. また Brice は、.NET Core が計画されていたときと同時期に、SQLite ADO.NET プロバイダーの独自の実装を実験していました。Brice was also experimenting with his own implementation of a SQLite ADO.NET provider around the same time that .NET Core was being planned. 長期にわたる話し合いの後、Entity Framework チームは、Brice のプロトタイプに基づいて Microsoft.Data.Sqlite を作成することを決定しました。After a long discussion, the Entity Framework team decided to create Microsoft.Data.Sqlite based on Brice's prototype. これにより、.NET Core の目標に沿った、軽量で最新の新たな実装を作成できるようになりました。This would allow them to create a new lightweight and modern implementation that would align with the goals of .NET Core.

最新が意味するものを表す例として、以下に、System.Data.SQLite と Microsoft.Data.Sqlite の両方でユーザー定義関数を作成するコードを示します。As an example of what we mean by more modern, here is code to create a user-defined function in both System.Data.SQLite and 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 の戦略が変更されました。In 2017, .NET Core 2.0 experienced a change in strategy. .NET Core の成功には .NET Framework との互換性が不可欠であると判断したのです。It was decided that compatibility with .NET Framework was vital to the success of .NET Core. DataSet API など、削除されていた API の多くが再び追加されました。Many of the removed APIs, including the DataSet APIs, were added back. 他の多くのものと同様に、これによって System.Data.SQLite の障害となっていた要素が取り除かれ、.NET Core にも移植できるようになりました。Like it did for many others, this unblocked System.Data.SQLite allowing it to also be ported to .NET Core. ただし、Microsoft.Data.Sqlite の当初の目標である軽量で最新という点も引き続き維持されています。The original goal of Microsoft.Data.Sqlite to be lightweight and modern, however, still remains. Microsoft.Data.Sqlite で実装されていない ADO.NET API の詳細については、「ADO.NET の制限事項」を参照してください。See ADO.NET limitations for details about ADO.NET APIs not implemented by Microsoft.Data.Sqlite.

Microsoft.Data.Sqlite に新機能が追加されるときは、System.Data.SQLite の設計が考慮されます。When new features are added to Microsoft.Data.Sqlite, the design of System.Data.SQLite is taken into account. Microsoft では、この 2 つの切り替えを容易にするため、できる限り、これらの間で行う変更を最小限に抑えるように努力しています。We try, when possible, to minimize changes between the two to ease transitioning between them.

データの種類Data types

Microsoft.Data.Sqlite と System.Data.SQLite の最も大きな違いはデータ型の処理方法です。The biggest difference between Microsoft.Data.Sqlite and System.Data.SQLite is how data types are handled. データ型」で説明しているように、Microsoft.Data.Sqlite では SQLite の根本にある特異な点、つまり、すべての任意文字列を列の型として指定でき、そのプリミティブ型は、INTEGER、REAL、TEXT、および BLOB の 4 つだけあるということを明らかにしています。As described in Data types, Microsoft.Data.Sqlite doesn't try to hide the underlying quirkiness of SQLite, which allows any arbitrary string to be specified as the column type, and only has four primitive types: INTEGER, REAL, TEXT, and BLOB.

System.Data.SQLite では、追加のセマンティクスが列の型に適用され、それらが直接 .NET 型にマップされます。System.Data.SQLite applies additional semantics to column types mapping them directly to .NET types. これにより、このプロバイダーはより厳密に型指定されている印象を与えますが、改善が必要な点もあります。This gives the provider a more strongly typed feel, but it has some rough edges. たとえば、SELECT ステートメントで式の列の型を指定するために、新しい SQL ステートメント (TYPES) を導入する必要がありました。For example, they had to introduce a new SQL statement (TYPES) to specify the column types of expressions in SELECT statements.

接続文字列Connection strings

Microsoft.Data.Sqlite の方が、接続文字列キーワードの数が大幅に少なくなります。Microsoft.Data.Sqlite has a lot fewer connection string keywords. 次の表に、使用できる代替手段を示します。The following table shows alternatives that can be used instead.

キーワードKeyword 代替Alternative
Cache SizeCache Size PRAGMA cache_size = <pages> を送信しますSend PRAGMA cache_size = <pages>
[Default Timeout](既定のタイムアウト)Default Timeout SqliteConnection の DefaultTimeout プロパティを使用しますUse the DefaultTimeout property on SqliteConnection
FailIfMissingFailIfMissing Mode=ReadWrite を使用しますUse Mode=ReadWrite
FullUriFullUri データ ソース キーワードを使用しますUse the Data Source keyword
Journal ModeJournal Mode PRAGMA journal_mode = <mode> を送信しますSend PRAGMA journal_mode = <mode>
Legacy FormatLegacy Format PRAGMA legacy_file_format = 1 を送信しますSend PRAGMA legacy_file_format = 1
Max Page CountMax Page Count PRAGMA max_page_count = <pages> を送信しますSend PRAGMA max_page_count = <pages>
Page SizePage Size PRAGMA page_size = <bytes> を送信しますSend PRAGMA page_size = <bytes>
[読み取り専用]Read Only Mode=ReadOnly を使用しますUse Mode=ReadOnly
同期Synchronous PRAGMA synchronous = <mode> を送信しますSend PRAGMA synchronous = <mode>
URIUri データ ソース キーワードを使用しますUse the Data Source keyword
UseUTF16EncodingUseUTF16Encoding PRAGMA encoding = 'UTF-16' を送信しますSend PRAGMA encoding = 'UTF-16'

承認Authorization

Microsoft.Data.Sqlite には、SQLite の認証コールバックを公開する API がありません。Microsoft.Data.Sqlite doesn't have any API exposing SQLite's authorization callback. この機能に関するフィードバックを送信するには、問題 #13835 を使用してください。Use issue #13835 to provide feedback about this feature.

データ変更通知Data change notifications

Microsoft.Data.Sqlite には、SQLite のデータ変更通知を公開する API がありません。Microsoft.Data.Sqlite doesn't have any API exposing SQLite's data change notifications. この機能に関するフィードバックを送信するには、問題 #13827 を使用してください。Use issue #13827 to provide feedback about this feature.

仮想テーブル モジュールVirtual table modules

Microsoft Data Sqlite には、仮想テーブル モジュールを作成するための API がありません。Microsoft.Data.Sqlite doesn't have any API for creating virtual table modules. この機能に関するフィードバックを送信するには、問題 #13823 を使用してください。Use issue #13823 to provide feedback about this feature.

関連項目See also