Program Club

colid 6에 대해 bcp 클라이언트로부터 유효하지 않은 열 길이를 받았습니다.

proclub 2020. 10. 22. 23:44
반응형

colid 6에 대해 bcp 클라이언트로부터 유효하지 않은 열 길이를 받았습니다.


c # 코드에서 csv 파일 데이터를 SQL Server 2005로 대량 업로드하고 싶지만 아래 오류가 발생합니다.

colid 6에 대해 bcp 클라이언트에서 유효하지 않은 열 길이를 받았습니다.

대량 복사가 데이터베이스 서버에 쓸 때


Excel의 데이터 열 중 하나 (Column Id 6)에 데이터베이스의 datacolumn 데이터 유형 길이를 초과하는 하나 이상의 셀 데이터가 있습니다.

Excel에서 데이터를 확인하십시오. 또한 Excel의 데이터 형식이 데이터베이스 테이블 스키마를 준수하는지 확인하십시오.

이를 방지하려면 데이터베이스 테이블에서 문자열 데이터 유형의 데이터 길이를 초과하십시오.

도움이 되었기를 바랍니다.


이 게시물이 오래되었다는 것을 알고 있지만 동일한 문제가 발생하여 마침내 문제를 일으키는 열을 확인하고 필요에 따라 다시보고하는 솔루션을 찾았습니다. 그 결정 colid은 값을 얻기 위해 그것에서 1을 뺄 필요가 있도록 SQLEXCEPTION 반환 기반으로 0이 아닌. 그 후에 _sortedColumnMappings는 SqlBulkCopy 인스턴스에 추가 된 열 매핑의 인덱스가 아닌 SqlBulkCopy 인스턴스 ArrayList 인덱스로 사용됩니다 . 한 가지 주목할 점은 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 BulkCopy 옵션을 사용하여 데이터베이스 테이블에 문자열을 전달하는 동안 비슷한 종류의 문제가 발생했습니다. 내가 전달한 문자열은 3 자이지만 대상 열 길이는 varchar(20). Trim()문제가 문자열의 공백 (선행 및 후행)으로 인한 것인지 확인하기 위해 함수를 사용하여 DB에 삽입하기 전에 문자열을 트리밍하려고했습니다 . 줄을 다듬은 후에는 잘 작동했습니다.

당신은 시도 할 수 있습니다 text.Trim()


대량 삽입 / 복사를 수행중인 테이블의 열 크기를 확인하십시오. varchar 또는 기타 문자열 열을 확장하거나 삽입하는 값을 잘라야 할 수 있습니다. 열 순서도 테이블과 동일해야합니다.

예 : varchar 열의 크기를 30에서 50으로 늘리기 =>

ALTER TABLE [dbo]. [TableName] ALTER COLUMN [ColumnName] Varchar (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;
}

참고 URL : https://stackoverflow.com/questions/10442686/received-an-invalid-column-length-from-the-bcp-client-for-colid-6

반응형