Partager via


Erreurs de base de données

SqliteException est lancée lorsqu’une erreur SQLite est rencontrée. Le message est fourni par SQLite. Les propriétés SqliteErrorCode et SqliteExtendedErrorCode contiennent le code de résultat SQLite de l’erreur.

Des erreurs peuvent être rencontrées chaque fois que Microsoft.Data.Sqlite interagit avec la bibliothèque SQLite native. La liste suivante présente les scénarios courants dans lesquels des erreurs peuvent se produire :

  • Ouverture d’une connexion.
  • Début d’une transaction.
  • Exécution d’une commande.
  • Appel de NextResult.

Réfléchissez soigneusement à la façon dont votre application gère ces erreurs.

Verrouillage, réessais et délais d’expiration

Avertissement

Bien que SQLite prenne en charge l’accès simultané à la même base de données à partir de plusieurs threads, les objets API .NET ne sont pas thread-safe. Cela signifie que SqliteConnection, SqliteCommand et SqliteDataReader ne peut pas être partagé et utilisé simultanément à partir de plusieurs threads. Lorsque vous utilisez Microsoft.Data.Sqlite à partir d’une application simultanée, créez et ouvrez simplement une nouvelle instance de SqliteConnection chaque fois que vous devez accéder à la base de données (le regroupement garantit qu’il s’agit d’une opération rapide).

SQLite est agressif lorsqu’il s’agit de verrouiller des tables et des fichiers de base de données. Si votre application permet un accès simultané à la base de données, vous rencontrerez probablement des erreurs de surcharge et de verrouillage. Vous pouvez atténuer de nombreuses erreurs à l’aide de la journalisation en écriture anticipée.

Chaque fois que Microsoft.Data.Sqlite rencontre une erreur occupée ou verrouillée, elle réessaye automatiquement jusqu’à ce qu’elle réussisse ou que le délai d’expiration de la commande soit atteint.

Vous pouvez augmenter le délai d’expiration d’une commande en définissant CommandTimeout. Le délai d’expiration par défaut est de 30 secondes. Valeur de 0 signifie qu’aucun délai d’expiration n’est nécessaire.

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

Microsoft.Data.Sqlite doit parfois créer un objet de commande implicite. Par exemple, pendant BeginTransaction. Pour définir le délai d’expiration de ces commandes, utilisez DefaultTimeout.

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

Voir aussi