Udostępnij przez


Błędy bazy danych

SqliteException jest zgłaszany po napotkaniu błędu SQLite. Komunikat jest dostarczany przez SQLite. Właściwości SqliteErrorCode i SqliteExtendedErrorCode zawierają kod wyniku błędu SQLite.

Błędy mogą wystąpić w dowolnym momencie, gdy witryna Microsoft.Data.Sqlite współdziała z natywną biblioteką SQLite. Na poniższej liście przedstawiono typowe scenariusze, w których mogą wystąpić błędy:

  • Otwieranie połączenia.
  • Rozpoczynanie transakcji.
  • Wykonywanie polecenia.
  • Wywoływanie NextResult.

Zastanów się dokładnie, jak aplikacja będzie obsługiwać te błędy.

Blokowanie, ponawianie prób i przekroczenia limitu czasu

Ostrzeżenie

Chociaż sqLite obsługuje współbieżny dostęp do tej samej bazy danych z wielu wątków, obiekty interfejsów API platformy .NET nie są bezpieczne wątkowo. Oznacza to, że SqliteConnection, SqliteCommand i SqliteDataReader nie mogą być współużytkowane i używane współbieżnie z wielu wątków. W przypadku korzystania z biblioteki Microsoft.Data.Sqlite z aplikacji współbieżnej wystarczy utworzyć i otworzyć nowe wystąpienie SqliteConnection zawsze, gdy trzeba uzyskać dostęp do bazy danych (poolowanie gwarantuje, że jest to szybka operacja).

SqLite jest agresywny, jeśli chodzi o blokowanie tabel i plików bazy danych. Jeśli Twoja aplikacja umożliwia jakikolwiek równoczesny dostęp do bazy danych, prawdopodobnie napotkasz błędy dotyczące zajętości i zablokowania. Wiele błędów da się ograniczyć przy użyciu logowania z wyprzedzeniem.

Za każdym razem, gdy Microsoft.Data.Sqlite napotka błąd zajęty lub zablokowany, automatycznie ponowi próbę, dopóki nie odniesie sukcesu lub nie zostanie osiągnięty limit czasu polecenia.

Limit czasu polecenia można zwiększyć, ustawiając wartość CommandTimeout. Domyślny limit czasu to 30 sekund. Wartość oznacza brak limitu 0 czasu.

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

Microsoft.Data.Sqlite czasami musi utworzyć niejawny obiekt polecenia. Na przykład podczas BeginTransaction. Aby ustawić limit czasu dla tych poleceń, użyj polecenia DefaultTimeout.

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

Zobacz także