出现场景: 批量插入数据的时候出现这个问题。
原因分析:某个数据的长度应该是大于这个数据对应的列的定义长度。
所以一一检查到底是那个列的长度超出了。
第一种方法:
从 bcp 客户端收到一个对 colid x 无效的列长度。colid x 是多少说明是第x+1列出了问题,比如colid 1说明是第二列。那么一一排查这列的数据就可以找到问题所在。
如果数据太多的话可以直接修改数据库的字段,把字段的数据类型的长度增大就行了。比如原先varchar(50)那么可以变成varchar(100)再试一下。
第二种方法:
网络提供了这个种方法,可以查找具体是哪个列的长度超出了。
public void GetFiledSizeTest()
{string fileFullName = @"D:\GameLogs\2015-01-30_000000\Login.log";//每列的最大长度Dictionary<int, int> dicFieldLength = new Dictionary<int, int>();//每列的最大长度所在行号Dictionary<int, int> dicMaxFieldLenthRowNum = new Dictionary<int, int>();for (int i = ; i < ; i++){dicFieldLength.Add(i, );dicMaxFieldLenthRowNum.Add(i, );}if (new FileInfo(fileFullName).Length > ){using (StreamReader sr = new StreamReader(fileFullName, Encoding.UTF8)){int rowNum = ;while (sr.Peek() > -){string strRow = sr.ReadLine();rowNum++;object[] objRow = strRow.Split(',');for (int i = ; i < objRow.Length; i++){var len=objRow[i].ToString().Length;if (dicFieldLength[i] < len){dicFieldLength[i] = len;dicMaxFieldLenthRowNum[i] = rowNum;}}}}}
}
第三种方法:
注意检查这几项:1、插入的某一列的数据的长度是否大于数据库列的定义的长度?
2、数据库某一列是否不为空,而插入的数据却为空
3、当用sqlbulkcopy批量插入数据时,内存数据表DataTable的列和数据库的列是否一致。