Obtenir le numéro de ligne sur lequel la demande à la base de données s'est terminée avec une erreur

c# reflection sqlbulkcopy sql-server

Question

J'utilise ce code pour envoyer une requête SQL:

 SqlBulkCopy bulkCopy = new SqlBulkCopy(Connection);

 foreach (DataColumn column in dt.Columns)
 {
     bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
 }

 bulkCopy.DestinationTableName = "nsi." + classifierData.Info.TableName;
 bulkCopy.WriteToServer(dt);

et obtenez cette exception:

A reçu une longueur de colonne non valide du client bcp pour colid

Existe-t-il un moyen d'identifier la ligne à l'origine de l'erreur?

J'ai essayé d'utiliser ceci, mais ça ne marche pas (les valeurs sont toujours les mêmes):

 FieldInfo currentRow = typeof(SqlBulkCopy).GetField("_currentRowLength", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 var currentRowNumber = currentRow.GetValue(bulkCopy);

 FieldInfo _rowsCopiedField = typeof(SqlBulkCopy).GetField("_rowsCopied", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
 var currentRowN = _rowsCopiedField.GetValue(bulkCopy);

S'il vous plaît, aidez-moi n'importe qui ...

Réponse acceptée

Je crois que la seule façon d'identifier la ligne d'erreur de purement SqlBulkCopy utilise la NotifyAfter propriété + SqlRowsCopied événement + BatchSize = 1.

À partir de ceux-ci, vous pouvez maintenant facilement avoir une propriété Index que vous incrémentez pour chaque ligne copiée avec succès et vous pourrez trouver l'index par erreur.

Par exemple, une erreur est renvoyée et vous essayez à NotifyAfter = 1 avec NotifyAfter = 1

bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.NotifyAfter = 1;
bulkCopy.BatchSize = 1;

Évidemment, ce n’est pas la meilleure solution en termes de performances, mais vous trouverez vos informations.

EDIT : Répondre au commentaire

Désolé, mais puis-je obtenir une valeur de row-column avec error?

Je ne pense pas. Nous ne savons pas exactement quelle colonne a un problème avec le message d'erreur.



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