2010-07-27 2 views
2

Courir très bas sur les idées ici. J'ai un cas où j'utilise SqlBulkCopy pour pomper des données dans une base de données, et à mi-chemin, je rencontre différentes exceptions (violations de clés primaires, violations d'index, etc.).Gestion des erreurs avec SqlBulkCopy - pourrait-il être plus difficile?

J'ai confirmé que les violations sont vraies et doivent être corrigées dans les données. Ce qui est exaspérant, cependant, c'est que si j'écrivais sur la DB avec un DataAdapter (ce qui serait beaucoup plus lent), les mauvaises lignes dans le DataSet auraient HasErrors activé afin que je puisse facilement les trouver et prendre soin de choses. Avec SqlBulkCopy? Rien. Nada. Bonne chance de trouver celui qui a causé votre problème car tout ce que vous obtiendrez est un nom d'erreur (comme "violation de clé primaire dans yada yada yada, bla bla bla") et c'est tout.

Des suggestions? Je ne peux pas croire qu'il n'y a aucun moyen d'obtenir ces erreurs. Avec le standard BCP, je pense que vous pouvez même pomper ces choses dans un fichier journal. Ne pouvons-nous faire quelque chose comme ça avec SqlBulkCopy?

Thx,

Répondre

0

Jetez un oeil au code source pour SqlBulkCopy - vous aurez votre réponse là-bas - il n'y a pas d'erreur de manipulation réelle là-bas.

Une chose que vous pourriez faire, même si boiteux que vous auriez à, est d'exécuter un lot erroring avec la taille du lot à 1.

+0

Le code source de cette classe est disponible? Je ne pensais pas que MS le publierait là-bas. Pourriez-vous élaborer un peu sur l'idée du lot d'erreurs? Je suis votre train de pensée ... Thx! –

+0

Oui, cela fait partie du code source .NET standard. Consultez http://netmassdownloader.codeplex.com/ pour le moyen le plus simple d'obtenir la source. Avec le batch d'erreur que je veux dire pour chaque ligne, effacez la table de données, appelez WriteToServer() - et vous aurez alors une meilleure idée de la ligne qui a échoué. La performance serait nulle - mais si vous ne l'avez fait que pour des lots erronés, cela pourrait bien fonctionner? –

+0

Le code source de SqlBulkCopy est également disponible sur github https://github.com/Microsoft/referencesource/blob/master/System.Data/System/Data/SqlClient/SqlBulkCopy.cs –

0

Quand je fais l'importation de données nécessitant la validation, je vais habituellement larguer les données dans une table qui prendra les données telles quelles, puis exécuter un proc stocké ou un autre sql qui peut valider mes données d'une manière basée sur un ensemble, faire les transformations, et le mettre dans la destination finale d'une manière que je peux contrôle.

+0

Cela fonctionne, sauf que vous êtes maintenant dupliquer toutes vos règles de validation de données. Vous les avez tous les deux sur la table elle-même et dans le proc stocké. Double l'entretien. –

+0

Pas vrai ... validation en un seul endroit ... le sproc. L'encart en vrac l'obtient rapidement sur le fil où il peut être traité de manière fixe. C'est soit cela ou insérez un à la fois qui peut être chien lent. – Jeremy