从bcp客户端收到colid 6的无效列长度
我想从c#代码批量上传CSV文件数据到SQL Server 2005,但我遇到了下面的错误 –
从bcp客户端收到colid 6的无效列长度。
当批量复制写入数据库服务器时
Excel中的一个数据列(列ID 6)有一个或多个单元格数据超过数据库中的数据列数据types长度。
在Excel中validation数据。 同时validationExcel格式的数据是否符合数据库表格模式。
为避免这种情况,请尝试超出数据库表中string数据types的数据长度。
希望这可以帮助。
我知道这个post是旧的,但我遇到了同样的问题,并最终找出一个解决scheme,以确定哪个列导致问题,并根据需要回报。 我终于明白,在SqlException中返回的colid不是基于零的,所以你需要从它中减去1来得到值。 之后,它将用作SqlBulkCopy实例的_sortedColumnMappings ArrayList的索引,而不是添加到SqlBulkCopy实例的列映射的索引。 有一件事要注意的是,SqlBulkCopy将停止收到的第一个错误,所以这可能不是唯一的问题,但至less有助于弄清楚。
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选项将string传递给数据库表时,遇到类似的问题。 我传递的string是3个字符,而目标列的长度是varchar(20)
。 在使用Trim()
函数插入数据库之前,我尝试修剪string,以检查问题是否由于string中的任何空格(前导和尾随)而引起的。 修剪string后,它工作正常。
你可以尝试text.Trim()
伟大的一段代码,感谢分享!
我结束了使用reflection来获取实际的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; }
检查您正在执行批量插入/复制的表中列的大小。 varchar或其他string列可能需要扩展,或者您插入的值需要修剪。 列顺序也应该和表中一样。
例如,将varchar列30的大小增加到50 =>
ALTER TABLE [dbo]。[TableName] ALTER COLUMN [ColumnName] Varchar(50)