• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
无忧岛主
实践是检验真理的唯一标准
博客园    首页    新随笔       管理    订阅  订阅
从 bcp 客户端收到一个对 colid x 无效的列长度。

 

出现场景: 批量插入数据的时候出现这个问题。

原因分析:某个数据的长度应该是大于这个数据对应的列的定义长度。

所以一一检查到底是那个列的长度超出了。

第一种方法:

——————————2017-1-3更新——————————————

从 bcp 客户端收到一个对 colid x 无效的列长度。colid x 是多少说明是第x+1列出了问题,比如colid 1说明是第二列。那么一一排查这列的数据就可以找到问题所在。

如果数据太多的话可以直接修改数据库的字段,把字段的数据类型的长度增大就行了。比如原先varchar(50)那么可以变成varchar(100)再试一下。

——————————2017-1-3更新——————————————

网络提供了这个种方法,可以查找具体是哪个列的长度超出了。

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 = 0; i < 11; i++)
 {
  dicFieldLength.Add(i, 0);
  dicMaxFieldLenthRowNum.Add(i, 0);
 }
 if (new FileInfo(fileFullName).Length > 0)
 {
  using (StreamReader sr = new StreamReader(fileFullName, Encoding.UTF8))
  {
   int rowNum = 0;
   while (sr.Peek() > -1)
   {
    string strRow = sr.ReadLine();
    rowNum++;
    object[] objRow = strRow.Split(',');
    for (int i = 0; i < objRow.Length; i++)
    {
       var len=objRow[i].ToString().Length;
 
       if (dicFieldLength[i] < len)
       {
        dicFieldLength[i] = len;
        dicMaxFieldLenthRowNum[i] = rowNum;
       }
 
    }
   }
  }
 }
}

 ——————————2017-9-4更新——————————————

注意检查这几项:1、插入的某一列的数据的长度是否大于数据库列的定义的长度?

                            2、数据库某一列是否不为空,而插入的数据却为空

                           3、当用sqlbulkcopy批量插入数据时,内存数据表DataTable的列和数据库的列是否一致。

如果本文引用了你的文章而未注明,请及时联系我。
posted on 2015-10-08 17:27  无忧岛主  阅读(27992)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3