Partilhar via


Erros da base de dados

SqliteException é lançado quando um erro SQLite é encontrado. A mensagem é fornecida pelo SQLite. As propriedades SqliteErrorCode e SqliteExtendedErrorCode contêm o código de resultado SQLite do erro.

Erros podem ser encontrados sempre que o Microsoft.Data.Sqlite interage com a biblioteca SQLite nativa. A lista a seguir mostra os cenários comuns onde erros podem ocorrer:

  • Abrir uma ligação.
  • Iniciar uma transação.
  • Executando um comando.
  • Ligando NextResult.

Considere cuidadosamente como seu aplicativo lidará com esses erros.

Bloqueio, tentativas e tempos limite

Advertência

Embora o SQLite ofereça suporte ao acesso simultâneo ao mesmo banco de dados a partir de vários threads, os objetos de APIs do .NET não são thread-safe. Isso significa que SqliteConnection, SqliteCommand e SqliteDataReader não podem ser compartilhados e usados simultaneamente a partir de vários threads. Ao utilizar Microsoft.Data.Sqlite de uma aplicação simultânea, basta criar e abrir uma nova instância de SqliteConnection sempre que precisar acessar a base de dados (o pool garante que essa seja uma operação rápida).

SQLite é agressivo quando se trata de bloquear tabelas e arquivos de banco de dados. Se o seu aplicativo habilitar qualquer acesso simultâneo ao banco de dados, é provável que encontre erros de ocupação e de bloqueio. Você pode mitigar muitos erros usando o registro de gravação antecipada.

Sempre que o Microsoft.Data.Sqlite encontrar um erro ocupado ou bloqueado, ele tentará automaticamente até que seja bem-sucedido ou o tempo limite do comando seja atingido.

Você pode aumentar o tempo limite de um comando definindo CommandTimeout. O tempo limite padrão é de 30 segundos. Um valor de 0 significa que não há tempo limite.

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

Microsoft.Data.Sqlite às vezes precisa criar um objeto de comando implícito. Por exemplo, durante BeginTransaction. Para definir o tempo limite para esses comandos, use DefaultTimeout.

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

Ver também