Quelle est la meilleure façon d'en bloc de la base de données des inserts à partir de c#?
Comment/quel est le meilleur moyen de le faire en bloc de la base de données des inserts?
En C#, je suis une itération sur une collection et l'appel d'une procédure stockée insert pour chaque élément de la collection.
Comment puis-je envoyer toutes les données dans une base de données d'appel?
E. g. dire que j'ai une liste de personne (List<Person>
) contenant 10 éléments. Je suis actuellement en appelant le InsertPerson stockées proc 10 fois. Je voudrais réduire ce chiffre à 1 appel.
Je suis à l'aide de MS SQL Server 2005.
- Certainement vérifier cette question. Le topvoted réponse (non, ce n'est pas la mienne:p) présente une très solution élégante à ce problème exact.
- merci pour cette question
Vous devez vous connecter pour publier un commentaire.
CsharperGuyInLondon, voici un exemple simple de SqlBulkCopy code:
Bien, 10 éléments n'est pas ce que j'appelle en vrac, mais pour les grands ensembles,
SqlBulkCopy
est votre ami. Tout ce que vous devez faire est de nourrir unDataTable
ou unIDataReader
(mon option préférée, 'cos j'aime streaming Api). J'ai fait quelque chose de similaire ici (vous pouvez ignorer le xml côté - tout sous-classe de la SimpleDataReader).L' .NET SqlBulkCopy classe fonctionne très bien.
Vous pouvez construire une GOUTTE (de l'image) et l'envoyer comme paramètre à une procédure stockée. À l'intérieur de la procédure stockée, vous pouvez récupérer tous les éléments à l'aide de la fonction substring().
Voici un bon exemple de
SqlBulkCopy
en action:http://blogs.msdn.com/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspx
J'construire la liste comme une chaîne de caractères xml et de le passer à la procédure stockée. Dans SQL 2005, il a amélioré les fonctionnalités xml à parser le xml et faire une insertion en bloc.
vérifier ce message:
En passant listes de SQL Server 2005 avec les Paramètres XML
Dump vos données à un canal délimité (ou autre chose si vos données ont conduites dans ce fichier texte et les utiliser Bulk Insert.
Vous pourriez mettre à jour avec un document Xml, Sql 2005 fonctionne très bien avec eux. Un nœud par ligne, mais juste un paramètre pour Xml.
Créer un document XML qui contient tous les éléments à insérer. Ensuite, à l'intérieur d'une procédure stockée, utilisez le TSQL le support de xml (OPENXML) pour lire les données à partir du document XML et de l'insérer dans vos tables avec je l'espère un insert pour chaque table.
Toutefois, si vous n'insérez des données dans une table unique et n'ont pas besoin de base de données logique, pourquoi ne pas utiliser SqlBulkCopy?
Re la solution pour SqlBulkCopy, j'ai créé une classe que prend
Datatable
ou unList<T>
et une taille de mémoire Tampon (CommitBatchSize
). Il vous permet de convertir la liste à un tableau de données à l'aide d'une extension (en seconde classe).Il fonctionne très rapidement. Sur mon PC, je suis en mesure d'insérer plus de 10 millions de compliqué dossiers en moins de 10 secondes.
Ici, c'est la classe:
}
Voici un exemple lorsque je veux insérer une Liste de mon objet personnalisé
List<PuckDetection>
(ListDetections
):