从bcp客户端收到colid 6的无效列长度

San*_*ana 76 .net c# database sql-server sql-server-2005

我想从c#代码批量上传csv文件数据到sql server 2005,但我遇到以下错误 -

从bcp客户端收到colid 6的无效列长度.

批量复制写入数据库服务器时

b_s*_*til 167

我知道这篇文章已经过时了,但我遇到了同样的问题,最终找到了一个解决方案来确定导致问题的列,并根据需要报告.我确定colid在SqlException 中返回的不是基于零的,因此您需要从中减去1以获取该值.之后,它将用作_sortedColumnMappingsSqlBulkCopy实例的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;
}
Run Code Online (Sandbox Code Playgroud)

  • 对于大多数人来说可能是显而易见的,但是_"在SqlException中返回的colid不是基于零的"_帮我扼杀了这个. (7认同)
  • 这非常好,谢谢你提交. (4认同)
  • DataFormatException是一个自定义异常,因此我可以将问题报告为无效的列长度。我还无法弄清楚如何获取行号。 (2认同)
  • 很好的解决方案,唯一缺少的是 catch sqlTran.RollBack(); (2认同)

Din*_*esh 62

excel中的一个数据列(列Id 6)具有一个或多个超出数据库中datacolumn数据类型长度的单元数据.

验证excel中的数据.还要验证excel中的数据,使其格式符合数据库表模式.

要避免这种情况,请尝试超出数据库表中字符串数据类型的数据长度.

希望这可以帮助.

  • 具体来说,如果您有任何小于 4 的 VARCHAR 列,请注意数据中的 NULL 被误解为 4char 字符串“NULL” (2认同)

小智 5

在使用 SQL BulkCopy 选项将字符串传递到数据库表时,我遇到了类似的问题。我传递的字符串有 3 个字符,而目标列长度为varchar(20)。我尝试在插入数据库之前使用函数修剪字符串,Trim()以检查问题是否是由于字符串中的任何空格(前导和尾随)引起的。修剪完绳子后,效果很好。

你可以试试text.Trim()