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)
Din*_*esh 62
excel中的一个数据列(列Id 6)具有一个或多个超出数据库中datacolumn数据类型长度的单元数据.
验证excel中的数据.还要验证excel中的数据,使其格式符合数据库表模式.
要避免这种情况,请尝试超出数据库表中字符串数据类型的数据长度.
希望这可以帮助.
小智 5
在使用 SQL BulkCopy 选项将字符串传递到数据库表时,我遇到了类似的问题。我传递的字符串有 3 个字符,而目标列长度为varchar(20)。我尝试在插入数据库之前使用函数修剪字符串,Trim()以检查问题是否是由于字符串中的任何空格(前导和尾随)引起的。修剪完绳子后,效果很好。
你可以试试text.Trim()
| 归档时间: |
|
| 查看次数: |
88149 次 |
| 最近记录: |