c# - कॉलिड 6 के लिए bcp क्लाइंट से एक अमान्य स्तंभ लंबाई प्राप्त की




.net sql-server (4)

SQL बुलकॉपी विकल्प का उपयोग करके डेटाबेस स्ट्रिंग के लिए एक स्ट्रिंग पास करते समय मुझे इसी तरह की समस्या का सामना करना पड़ा। मैं जिस स्ट्रिंग से गुजर रहा था वह 3 वर्णों की थी जबकि गंतव्य स्तंभ की लंबाई varchar(20) । मैंने Trim() फ़ंक्शन का उपयोग करके यह जांचने के लिए स्ट्रिंग को ट्रिम करने की कोशिश की कि क्या स्ट्रिंग में किसी भी स्थान (अग्रणी और अनुगामी) के कारण समस्या थी। स्ट्रिंग को ट्रिम करने के बाद, इसने ठीक काम किया।

आप text.Trim() कोशिश कर सकते हैं। text.Trim()

मैं सी # सर्वर से sql सर्वर 2005 में सीएसवी फ़ाइल डेटा को अपलोड करना चाहता हूं, लेकिन मैं नीचे त्रुटि का सामना कर रहा हूं -

कॉलिड 6 के लिए bcp क्लाइंट से एक अमान्य स्तंभ लंबाई प्राप्त की।

जब थोक प्रतिलिपि डेटाबेस सर्वर को लिखें


आपके द्वारा बल्क इंसर्ट / कॉपी की जा रही तालिका में स्तंभों के आकार की जाँच करें। varchar या अन्य स्ट्रिंग कॉलम को विस्तारित करने की आवश्यकता हो सकती है या आपके द्वारा डाले जा रहे मूल्य को ट्रिम करने की आवश्यकता होती है। स्तंभ क्रम भी तालिका में समान होना चाहिए।

उदाहरण के लिए, varchar कॉलम का आकार 30 से 50 => तक बढ़ाएं

अन्य टेबल [dbo]। [तालिका नाम] ALTER COLUMN [कॉलम नाम] वर्चर (50)


कोड का महान टुकड़ा, साझा करने के लिए धन्यवाद!

मैं वास्तविक DataMemberName को एक त्रुटि पर एक ग्राहक को वापस लाने के लिए प्रतिबिंब का उपयोग करके समाप्त हुआ (मैं WCF सेवा में बल्क सेव का उपयोग कर रहा हूं)। उम्मीद है कि किसी और ने मुझे कैसे उपयोगी पाया होगा।

static string GetDataMemberName(string colName, object t) {
  foreach(PropertyInfo propertyInfo in t.GetType().GetProperties()) {
    if (propertyInfo.CanRead) {
      if (propertyInfo.Name == colName) {
        var attributes = propertyInfo.GetCustomAttributes(typeof(DataMemberAttribute), false).FirstOrDefault() as DataMemberAttribute;
        if (attributes != null && !string.IsNullOrEmpty(attributes.Name))
          return attributes.Name;
        return colName;
      }
    }
  }
  return colName;
}


मुझे पता है कि यह पोस्ट पुरानी है, लेकिन मैं इसी मुद्दे में भाग गया और अंत में यह पता लगाने के लिए एक समाधान निकाला कि कौन सा कॉलम समस्या पैदा कर रहा है और इसे आवश्यकतानुसार रिपोर्ट करें। मैंने निर्धारित किया कि SqlException में लौटा हुआ शून्य शून्य आधारित नहीं है, इसलिए आपको मूल्य प्राप्त करने के लिए इसमें से 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;
}




sql-server-2005