Je sais que ce message est vieux mais j'ai rencontré le même problème et j'ai finalement trouvé une solution pour déterminer quelle colonne posait problème et le signaler si nécessaire. J'ai découvert que colid
retourné dans SqlException n'est pas basé à zéro, donc vous devez lui soustraire 1 pour obtenir la valeur. Ensuite, il est utilisé comme indice de la ArrayList _sortedColumnMappings
de l'instance SqlBulkCopy, et non comme l'indice des correspondances de colonnes qui ont été ajoutées à l'instance SqlBulkCopy. Une chose à noter est que SqlBulkCopy s'arrêtera à la première erreur reçue, donc ce n'est peut-être pas le seul problème, mais au moins cela aide à le résoudre.
essaie
{
bulkCopy.WriteToServer(importTable);
sqlTran.Commit();
}
attraper (SqlException ex)
{
if (ex.Message.Contains("Received an invalid column length from the bcp client for colid"))
{
string motif = @"\d+";
Match correspondance = Regex.Match(ex.Message.ToString(), motif);
var index = Convert.ToInt32(correspondance.Value) -1;
FieldInfo fi = typeof(SqlBulkCopy).GetField("_sortedColumnMappings", BindingFlags.NonPublic | BindingFlags.Instance);
var colonnesTriees = fi.GetValue(bulkCopy);
var éléments = (Objet[])colonnesTriees.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(colonnesTriees);
FieldInfo donnéesElément = éléments[index].GetType().GetField("_metadata", BindingFlags.NonPublic | BindingFlags | BindingFlags.Instance);
var métadonnées = donnéesElément.GetValue(éléments[index]);
var colonne = métadonnées.GetType().GetField("colonne", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(métadonnées);
var longueur = métadonnées.GetType().GetField("longueur", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(métadonnées);
jeter un nouveau DataFormatException(String.Format("La colonne: {0} contient des données d'une longueur supérieure à: {1}", colonne, longueur));
}
throw;
}