Vergleich mit System.Data.SQLite
2005 erstellte Robert Simpson System.Data.SQLite, einen SQLite-Anbieter für ADO.NET 2.0. Im Jahr 2010 übernahm das SQLite-Team die Wartung und Entwicklung des Projekts. Es ist auch erwähnenswert, dass das Mono-Team den Code im Jahr 2007 als Mono.Data.Sqlite forkte. System.Data.SQLite verfügt über eine lange Geschichte und hat sich zu einem stabilen und vollständigen ADO.NET Anbieter entwickelt, der mit visual Studio-Tools ausgestattet ist. Neue Versionen liefern weiterhin Assemblys, die mit jeder Version des .NET Frameworks kompatibel sind, bis zurück zur Version 2.0 und sogar mit dem .NET Compact Framework 3.5.
Die erste Version von .NET Core (veröffentlicht 2016) war eine einzelne, einfache, moderne und plattformübergreifende Implementierung von .NET. Veraltete APIs und APIs mit moderneren Alternativen wurden absichtlich entfernt. ADO.NET enthielt keine der DataSet-APIs (einschließlich DataTable und DataAdapter).
Das Entity Framework-Team war mit der Codebasis System.Data.SQLite etwas vertraut. Brice Lambson, ehemaliges Mitglied des EF-Teams, hatte zuvor dem SQLite-Team geholfen, Unterstützung für entity Framework-Versionen 5 und 6 hinzuzufügen. Brice experimentierte auch mit seiner eigenen Implementierung eines SQLite-ADO.NET-Anbieters zur gleichen Zeit, wie .NET Core geplant wurde. Nach einer langen Diskussion entschied sich das Entity Framework-Team, Microsoft.Data.Sqlite basierend auf brices Prototyp zu erstellen. Dies würde es ihnen ermöglichen, eine neue einfache und moderne Implementierung zu erstellen, die den Zielen von .NET Core entspricht.
Als Beispiel dafür, was wir mit „moderner“ meinen, finden Sie nachstehend Code zum Erstellen einer benutzerdefinierten Funktion in „System.Data.SQLite“ und „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));
Im Jahr 2017 erlebte .NET Core 2.0 eine Änderung der Strategie. Es wurde beschlossen, dass die Kompatibilität mit .NET Framework für den Erfolg von .NET Core von entscheidender Bedeutung war. Viele der entfernten APIs, einschließlich der DataSet-APIs, wurden wieder hinzugefügt. Dadurch wurde die Blockierung von „System.Data.SQLite“ (wie von vielen anderen auch) aufgehoben, sodass diese ebenfalls zu .NET Core portiert werden konnte. Das ursprüngliche Ziel von Microsoft.Data.Sqlite, einfach und modern zu sein, bleibt jedoch noch erhalten. Weitere Informationen zu ADO.NET APIs, die von Microsoft.Data.Sqlite nicht implementiert wurden, finden Sie unter ADO.NET Einschränkungen.
Wenn neue Features zu Microsoft.Data.Sqlite hinzugefügt werden, wird das Design von System.Data.SQLite berücksichtigt. Wir versuchen, nach Möglichkeit Änderungen zwischen den beiden zu minimieren, um den Übergang zwischen ihnen zu erleichtern.
Datentypen
Der größte Unterschied zwischen Microsoft.Data.Sqlite und System.Data.SQLite besteht darin, wie Datentypen behandelt werden. Wie unter Datentypen beschrieben, versucht „Microsoft.Data.Sqlite“ nicht, die zugrunde liegende Eigenwilligkeit von SQLite zu verbergen, wodurch jede beliebige Zeichenfolge als Spaltentyp angegeben werden kann, und verfügt über nur vier primitive Typen: INTEGER, REAL, TEXT und BLOB.
System.Data.SQLite wendet zusätzliche Semantik auf Spaltentypen an, die sie direkt .NET-Typen zuordnen. Dadurch erhält der Anbieter ein stärker typisiertes Erscheinungsbild, weist aber einige Ecken und Kanten auf. Sie mussten beispielsweise eine neue SQL-Anweisung (TYPES) einführen, um die Spaltentypen von Ausdrücken in SELECT-Anweisungen anzugeben.
Verbindungszeichenfolgen
„Microsoft.Data.Sqlite“ verfügt über deutlich weniger Schlüsselwörter für Verbindungszeichenfolgen. In der folgenden Tabelle sind Alternativen aufgeführt, die stattdessen verwendet werden können.
Schlüsselwort | Alternative |
---|---|
Cachegröße | Senden von PRAGMA cache_size = <pages> |
FailIfMissing | Verwenden Sie Mode=ReadWrite |
FullUri | Verwenden des Schlüsselworts "Datenquelle" |
Journalmodus | Senden von PRAGMA journal_mode = <mode> |
Legacy Format | Senden von PRAGMA legacy_file_format = 1 |
Max. Seitenanzahl | Senden von PRAGMA max_page_count = <pages> |
Seitengröße | Senden von PRAGMA page_size = <bytes> |
Nur Leseberechtigung | Verwenden Sie Mode=ReadOnly |
Synchron | Senden von PRAGMA synchronous = <mode> |
Uri | Verwenden des Schlüsselworts "Datenquelle" |
UseUTF16Encoding | Senden von PRAGMA encoding = 'UTF-16' |
Ermächtigung
Microsoft.Data.Sqlite verfügt über keine API, die den Autorisierungsrückruf von SQLite verfügbar macht. Verwenden Sie das Problem #13835, um Feedback zu diesem Feature zu geben.
Datenänderungsbenachrichtigungen
Microsoft.Data.Sqlite verfügt über keine API, die SQLites Datenänderungsbenachrichtigungen verfügbar macht. Verwenden Sie das Problem #13827, um Feedback zu diesem Feature zu geben.
Virtuelle Tabellenmodule
Microsoft.Data.Sqlite verfügt nicht über eine API zum Erstellen virtueller Tabellenmodule. Verwenden Sie die Vorgangsnummer #13823, um Feedback zu dieser Funktion zu geben.