मुझे पता है कि यह पोस्ट पुरानी है, लेकिन मैं इसी मुद्दे में भाग गया और अंत में यह निर्धारित करने के लिए एक समाधान निकाला कि कौन सा कॉलम समस्या पैदा कर रहा था और आवश्यकतानुसार इसे वापस रिपोर्ट करें। मैंने पाया कि colid
SqlException में लौटाया गया शून्य आधारित नहीं है, इसलिए आपको मान प्राप्त करने के लिए इसमें से 1 घटाना होगा। उसके बाद इसे _sortedColumnMappings
. की अनुक्रमणिका के रूप में प्रयोग किया जाता है SqlBulkCopy इंस्टेंस की ArrayList कॉलम मैपिंग की अनुक्रमणिका नहीं है जो SqlBulkCopy इंस्टेंस में जोड़े गए थे। ध्यान देने वाली एक बात यह है कि SqlBulkCopy प्राप्त पहली त्रुटि पर रुक जाएगा, इसलिए यह एकमात्र मुद्दा नहीं हो सकता है लेकिन कम से कम इसे समझने में मदद करता है।
try
{
bulkCopy.WriteToServer(importTable);
sqlTran.Commit();
}
catch (SqlException ex)
{
if (ex.Message.Contains("Received an invalid column length from the bcp client for colid"))
{
string pattern = @"\d+";
Match match = Regex.Match(ex.Message.ToString(), pattern);
var index = Convert.ToInt32(match.Value) -1;
FieldInfo fi = typeof(SqlBulkCopy).GetField("_sortedColumnMappings", BindingFlags.NonPublic | BindingFlags.Instance);
var sortedColumns = fi.GetValue(bulkCopy);
var items = (Object[])sortedColumns.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sortedColumns);
FieldInfo itemdata = items[index].GetType().GetField("_metadata", BindingFlags.NonPublic | BindingFlags.Instance);
var metadata = itemdata.GetValue(items[index]);
var column = metadata.GetType().GetField("column", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
var length = metadata.GetType().GetField("length", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).GetValue(metadata);
throw new DataFormatException(String.Format("Column: {0} contains data with a length greater than: {1}", column, length));
}
throw;
}