Utilisation de SqlBulkInsert dans des applications de production

bulkinsert c# database sql sqlbulkcopy

Question

Nous développons actuellement une application qui génère plus de 5 000 à 10 000 lignes de données dans une table particulière pour chaque session utilisateur. Nous utilisons actuellement des commandes de texte SQL pour insérer chaque ligne de données à la fois, de sorte qu'une opération de sauvegarde peut prendre jusqu'à une minute. Nous jouons avec l'utilisation de SqlBulkInserts et avons vu le temps passer à moins de 500 ms. Quelqu'un s’oppose-t-il à l’utilisation de SqlBulkInserts dans une application de production où de nombreux utilisateurs utiliseront le système?

Réponse acceptée

Je n'ai jamais rencontré de problème avec SqlBulkCopy avec le jeu d'options TableLock et avec le blocage d'un autre utilisateur. L'option TableLock augmente l'efficacité de l'insert par rapport à ce que beaucoup de gens ont dit et, tout simplement, son utilisation me l'a montré.

Ma méthode typique:

public void Bulk(String connectionString, DataTable data, String destinationTable)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        using (SqlBulkCopy bulkCopy =
            new SqlBulkCopy
            (
            connection,
            SqlBulkCopyOptions.TableLock |
            SqlBulkCopyOptions.FireTriggers |
            SqlBulkCopyOptions.UseInternalTransaction,
            null
            ))
        {
            bulkCopy.BatchSize = data.Rows.Count;
            bulkCopy.DestinationTableName = String.Format("[{0}]", destinationTable);
            connection.Open();
            bulkCopy.WriteToServer(data);
        }
    }
}

Réponse populaire

Avant d'implémenter avec SqlBulkInsert, essayez de créer votre requête INSERT manière dynamique pour ressembler à ceci:

insert into MyTable (Column1, Column2)
select 123, 'abc'
union all
select 124, 'def'
union all
select 125, 'yyy'
union all
select 126, 'zzz'

Ce sera un seul appel de base de données, qui devrait s'exécuter beaucoup plus rapidement. Pour la concaténation de chaînes SQL, assurez-vous d'utiliser la classe StringBuilder .



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi