Freigeben über


Datenbankfehler

SqliteException wird ausgelöst, wenn ein SQLite-Fehler auftritt. Die Nachricht wird von SQLite bereitgestellt. Die SqliteErrorCode Und SqliteExtendedErrorCode Eigenschaften enthalten den SQLite-Ergebniscode des Fehlers.

Fehler können auftreten, wenn microsoft.Data.Sqlite mit der nativen SQLite-Bibliothek interagiert. Die folgende Liste zeigt die allgemeinen Szenarien, in denen Fehler auftreten können:

  • Öffnen einer Verbindung.
  • Beginnen einer Transaktion.
  • Ausführen eines Befehls.
  • Aufrufen von NextResult.

Überlegen Sie sorgfältig, wie Ihre App diese Fehler behandelt.

Sperrung, erneute Versuche und Timeouts

Warnung

Obwohl SQLite gleichzeitigen Zugriff auf dieselbe Datenbank aus mehreren Threads unterstützt, sind die .NET-APIs-Objekte nicht threadsicher. Dies bedeutet, dass SqliteConnection, SqliteCommand und SqliteDataReader nicht gleichzeitig von mehreren Threads verwendet und geteilt werden können. Wenn Sie Microsoft.Data.Sqlite aus einer nebenläufigen Anwendung verwenden, erstellen und öffnen Sie einfach eine neue Instanz von SqliteConnection, wann immer Sie auf die Datenbank zugreifen müssen (Pooling stellt sicher, dass dies ein schneller Vorgang ist).

SQLite ist aggressiv, wenn es darum geht, Tabellen und Datenbankdateien zu sperren. Wenn Ihre App gleichzeitigen Datenbankzugriff ermöglicht, treten wahrscheinlich Fehler aufgrund von starker Auslastung und Sperrung auf. Sie können viele Fehler beheben, indem Sie das Write-Ahead-Logging verwenden.

Wenn Microsoft.Data.Sqlite einen Fehler aufgrund von starker Auslastung oder Sperrung feststellt, wird automatisch erneut versucht, den entsprechenden Befehl auszuführen, bis er erfolgreich ausgeführt wurde oder ein Timeout für den Befehl auftritt.

Sie können das Timeout eines Befehls erhöhen, indem Sie festlegen CommandTimeout. Der Standardzeitraum bis zum Timeout beträgt 30 Sekunden. Ein Wert von 0 bedeutet kein Timeout.

// Retry for 60 seconds while locked
command.CommandTimeout = 60;

Microsoft.Data.Sqlite muss manchmal ein implizites Befehlsobjekt erstellen. Zum Beispiel bei BeginTransaction. Verwenden Sie DefaultTimeoutzum Festlegen des Timeouts für diese Befehle .

// Set the default timeout of all commands on this connection
connection.DefaultTimeout = 60;

Siehe auch