मुझे पता है कि यह पोस्ट पुराना है लेकिन मैं इस मुद्दे पर भाग गया और अंततः यह निर्धारित करने के लिए एक समाधान निकाला कि कौन सा कॉलम समस्या पैदा कर रहा था और इसकी आवश्यकता के रूप में इसे वापस रिपोर्ट करें। अंततः मुझे पता चला कि कोलिड जो एसक्लएक्सप्शन में वापस लौटाया गया है शून्य आधारित नहीं है, इसलिए आपको मूल्य प्राप्त करने के लिए 1 से घटाकर उसे घटा देना होगा। इसके बाद इसे SqlBulkCopy उदाहरण के _sortedColumnMappings 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;
}
स्रोत
2013-10-31 17:02:42
यह बहुत अच्छी तरह से काम करता है, के लिए धन्यवाद भेजने। – Steven
क्या आपको पता है कि पंक्ति एनआर भी प्राप्त करना संभव है? –
आप डेटाफॉर्मेट एक्सेप्शन कहां से प्राप्त कर रहे हैं? क्या यह आपकी परियोजना के लिए एक स्थानीय वर्ग है? इसके अलावा आपका कोड अन्य सभी एसक्यूएल अपवादों को खाता है ... शायद एक रेथ्रो करें? – OmegaMan