2009-04-22 12 views
1

Nous avons un DataTable en mémoire dans une procédure CLR. Après un traitement important, le DataTable contient beaucoup de données que nous devons charger dans une table de la base de données. Malheureusement, puisque nous utilisons un context connection SqlBulkCopy ne fonctionnera pas (lève erreur: L'opération demandée n'est pas disponible sur la connexion de contexteoutline of context restrictions).SQL CLR SqlBulkCopy from DataTable

Nous envisageons de créer une connexion régulière supplémentaire et de l'utiliser pour exécuter SQLBulkCopy. Cela semble plutôt stupide compte tenu des frais généraux d'utilisation d'un regular connection over a context connection. Nous avons pensé à l'itération sur les lignes du DataTable et à l'insertion d'un enregistrement pour chacune d'elles, mais il est de taille énorme et SQLBulkCopy semble être le meilleur ajustement.

Nous ne sommes pas mariés à DataTable et recherchons simplement la meilleure méthode pour insérer une énorme quantité de données dans une base de données à partir d'une procédure CLR. Une note finale sur le DataTable est représentative d'une table de base de données sous-jacente mais n'est pas liée à la table via un DataSet ou un TableAdapter. Les moyens de le faire dans une procédure CLR n'étaient pas immédiatement évidents. Faire cela et utiliser la méthode AcceptChanges ou Update serait une solution acceptable.

Répondre

2

J'estime que SQLBulkCopy est 10 à 100 fois plus rapide que les insertions en fonction de la taille de la table, donc le compromis en vaut la peine. Voyant que vous effectuez un 'traitement significatif' sur votre DataTable, ce qui prend sans doute du temps et des ressources, le petit surcoût supplémentaire d'utiliser une connexion complète au lieu d'une connexion contextuelle ou d'ouvrir une connexion complètement nouvelle est un petit prix à payer.

+0

Vraiment le DataTable agit simplement comme un objet pratique pour stocker des enregistrements après un traitement important. Cela dit, la possibilité d'envoyer un DataTable brut à SqlBulkCopy pour l'insertion d'enregistrements semblait être un slam dunk jusqu'à ce que nous ayons rencontré le problème avec notre type de connexion. Plus je pense à cela, plus j'ai tendance à penser que l'ouverture d'une connexion régulière est probablement la voie à suivre. – ahsteele