Essayez d'emballer tous vos encarts (c'est-à-dire un encart en vrac) dans un seul transaction :
string insertString = "INSERT INTO [TableName] ([ColumnName]) Values (@value)";
SQLiteCommand command = new SQLiteCommand();
command.Parameters.AddWithValue("@value", value);
command.CommandText = insertString;
command.Connection = dbConnection;
SQLiteTransaction transaction = dbConnection.BeginTransaction();
try
{
//---INSIDE LOOP
SQLiteCommand sqlComm = new SQLiteCommand(sqlQuery, dbcon);
nRowUpdatedCount = sqlComm.ExecuteNonQuery();
//---END LOOP
transaction.Commit();
return true;
}
catch (SQLiteException ex)
{
transaction.Rollback();
}
Par défaut, SQLite englobe toutes les insertions dans une transaction. ce qui ralentit le processus :
INSERT est vraiment lent - je ne peux effectuer que quelques dizaines d'INSERT par seconde.
En fait, SQLite peut facilement effectuer 50 000 instructions INSERT ou plus par seconde sur un ordinateur de bureau moyen. Mais il ne fera que quelques dizaines de transactions par seconde.
La vitesse des transactions est limitée par la vitesse du disque dur car (par défaut) SQLite attend que les données soient réellement stockées en toute sécurité sur la surface du disque avant que la transaction ne soit terminée. De cette façon, si vous perdez soudainement de l'énergie ou si votre système d'exploitation se plante, vos données sont toujours en sécurité. Pour plus de détails, lisez ce qui concerne le commit atomique dans SQLite
Par défaut, chaque instruction INSERT constitue sa propre transaction. Mais si vous entourez plusieurs instructions INSERT de BEGIN...COMMIT, toutes les insertions sont regroupées en une seule transaction. Le temps nécessaire pour valider la transaction est amorti sur toutes les instructions d'insertion incluses, ce qui réduit considérablement le temps par instruction d'insertion.