從 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的列和數據庫的列是否一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM