meilleure façon de faire des insertions en vrac en utilisant dapper.net

.net bulkinsert c# dapper sql-server

Question

J'utilise le code suivant pour insérer des enregistrements dans une table dans SQL Server 2014

using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["myConnString"]))
{

   conn.Execute("INSERT statement here", insertList);

}

La liste d' insertList est une liste contenant 1 million d'éléments. J'ai testé cet insert sur un bureau i5 et il a fallu environ 65 minutes pour insérer un million d'enregistrements dans SQL Server sur le même ordinateur. Je ne sais pas comment Dapper fait les insertions dans les coulisses. Je ne veux certainement pas ouvrir et fermer la connexion à la base de données un million de fois!

Est-ce la meilleure façon de faire des insertions en masse dans dapper ou devrais-je essayer quelque chose d'autre ou aller avec ADO.Net simple en utilisant la bibliothèque d'entreprise?

MODIFIER

Avec le recul, je sais que l'utilisation d'ADO.Net sera meilleure, alors reformulera ma question. Je voudrais quand même savoir si c'est le meilleur que dapper peut faire ou si je manque une meilleure façon de le faire dans Dapper même?

Réponse d'expert

Le meilleur moyen gratuit d’insérer avec d’excellentes performances consiste à utiliser directement la classe SqlBulkCopy , comme l’ont suggéré Alex et Andreas.

Disclaimer : Je suis le propriétaire du projet Dapper Plus

Ce projet fournit un support facile pour les opérations suivantes:

  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

En utilisant le mappage et en permettant de générer des valeurs comme des colonnes d'identité.

// CONFIGURE & MAP entity
DapperPlusManager.Entity<Order>()
                 .Table("Orders")
                 .Identity(x => x.ID);

// CHAIN & SAVE entity
connection.BulkInsert(orders)
          .AlsoInsert(order => order.Items);
          .Include(x => x.ThenMerge(order => order.Invoice)
                         .AlsoMerge(invoice => invoice.Items))
          .AlsoMerge(x => x.ShippingAddress);   

Réponse populaire

Si vous recherchez des performances, je vous recommande d’utiliser SqlBulkCopy plutôt que d’utiliser Dapper. Voir ici pour des comparaisons de performances: http://www.ikriv.com/dev/db/SqlInsert/SqlInsert.html



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