Поделиться через


Ошибки базы данных

SqliteException возникает при обнаружении ошибки SQLite. Сообщение предоставляется SQLite. Свойства SqliteErrorCode и SqliteExtendedErrorCode содержат код результата ошибки SQLite.

Ошибки могут возникать при взаимодействии Microsoft.Data.Sqlite с собственной библиотекой SQLite. В следующем списке показаны распространенные сценарии, в которых могут возникнуть ошибки:

  • Открытие подключения.
  • Начало транзакции.
  • Выполнение команды.
  • Вызов NextResult.

Внимательно рассмотрим, как ваше приложение будет обрабатывать эти ошибки.

Блокировка, повторная попытка и время ожидания

Предупреждение

Хотя SQLite поддерживает одновременный доступ к одной базе данных из нескольких потоков, объекты API .NET не являются потокобезопасными. Это означает, что SqliteConnection, SqliteCommand и SqliteDataReader нельзя передавать для общего использования или одновременно использовать из нескольких потоков. При использовании Microsoft.Data.Sqlite из параллельного приложения просто создайте и откройте новый экземпляр SqliteConnection всякий раз, когда необходимо получить доступ к базе данных (пул гарантирует, что это быстрая операция).

SQLite является агрессивным, когда речь идет о блокировке таблиц и файлов базы данных. Если приложение включает любой одновременный доступ к базе данных, скорее всего, столкнутся с занятыми и заблокированными ошибками. Вы можете устранить множество ошибок с помощью журналирования с предварительной записью.

Когда Microsoft.Data.Sqlite сталкивается с ошибкой занятости или блокировки, он автоматически повторяет попытки до тех пор, пока не завершится успешно или не будет достигнуто время ожидания команды.

Вы можете увеличить время ожидания команды, задав параметр CommandTimeout. По умолчанию время ожидания составляет 30 секунд. Значение 0 означает, что время ожидания не истекло.

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

Microsoft.Data.Sqlite иногда требуется создать неявный объект команды. Например, во время BeginTransaction. Чтобы задать время ожидания для этих команд, используйте DefaultTimeout.

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

См. также