Подтвердить что ты не робот

Получена недопустимая длина столбца от клиента bcp для colid 6

Я хочу, чтобы загрузить данные CSV файла на sql-сервер 2005 из кода С#, но я столкнулся с приведенной ниже ошибкой -

Получена недопустимая длина столбца из клиента bcp для colid 6.

когда массовая копия записывается на сервер базы данных

4b9b3361

Ответ 1

Один из столбцов данных в excel (Идентификатор столбца 6) имеет одну или несколько данных ячейки, которые превышают длину данных datacolumn в базе данных.

Проверьте данные в excel. Также проверьте данные в excel, чтобы их формат соответствовал схеме таблицы базы данных.

Чтобы этого избежать, попробуйте превысить длину данных строкового типа данных в таблице базы данных.

Надеюсь, что это поможет.

Ответ 2

Я знаю, что этот пост старый, но я столкнулся с той же проблемой и, наконец, нашел решение, чтобы определить, какой столбец вызывал проблему, и доложить об этом по мере необходимости. Я определил, что colid возвращаемое в SqlException, не основано на нуле, поэтому вам нужно вычесть 1 из него, чтобы получить значение. После этого он используется в качестве индекса _sortedColumnMappings ArrayList экземпляра SqlBulkCopy, а не индекса сопоставлений столбцов, которые были добавлены в экземпляр 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;
}

Ответ 3

Я столкнулся с аналогичной проблемой при передаче строки в таблицу базы данных с использованием опции SQL BulkCopy. Строка я была длиной 3 символа, тогда как длина столбца назначения была varchar(20). Я попытался обрезать строку перед вставкой в ​​БД с помощью функции Trim(), чтобы проверить, была ли проблема связана с любым пространством (ведущим и конечным) в строке. После обрезки строки она отлично работала.

Вы можете попробовать text.Trim()

Ответ 4

Отличный фрагмент кода, спасибо за обмен!

В результате я использовал рефлексию, чтобы получить фактическое имя 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;
}

Ответ 5

Проверьте размер столбцов в таблице, в которой вы делаете массовую вставку/копию. может потребоваться расширение столбца varchar или других строк, или значение, которое вы вставляете, нужно обрезать. Порядок столбцов также должен быть таким же, как в таблице.

например, Увеличить размер столбца varchar 30 до 50 = >

ALTER TABLE [dbo]. [TableName] ALTER COLUMN [ColumnName] Varchar (50)