2012-08-28 46 views
0

我已經編寫了一些基本代碼來解析CSV文件,並在運行時將數據輸入到數據庫中。此代碼的變體(針對不同的分隔符和列)對於衆多的csv文件一直工作正常,但由於某種原因,現在這段代碼給了我一個2列文件的錯誤。參數丟失。 [參數序數= 1]?

using (StreamReader reader = new StreamReader(@"C:\Rawdata\Salesman.csv")) 
{ 
    string line; 
    StringBuilder query = new StringBuilder(); 

    while (!reader.EndOfStream) 
    { 
     line = reader.ReadLine(); 
     StringBuilder segment = new StringBuilder(); 

     for (int i = 0, segno = 0; i < line.Length; i++) 
     { 
      if (line[i] != '\t') 
      { 
       segment.Append(line[i]); 
      } 
      else 
      { 
       switch (segno) 
       { 
        case 0: 
         cmd.Parameters.Clear(); 
         cmd.Parameters.AddWithValue("@code", segment.ToString()); 

         break; 
        case 1: 
         cmd.Parameters.AddWithValue("@name", segment.ToString()); 
         break; 
        default: 
         break; 
       } 
       segno++; 
       segment.Clear(); 
      } 
     } 

     delCmd = "INSERT INTO sales_codes (code, name) VALUES (@code, @name)"; 
     cmd.CommandText = delCmd; 

     cmd.ExecuteNonQuery(); 

     query.Clear(); 
    } 
} 

的異常被拋出是:

SqlCeException - A parameter is missing. [ Parameter ordinal = 1 ] 

我有雙重和三重檢查一切從文件,代碼表模式和一切看起來很好。我錯過了什麼?

+0

是否有可能需要在參數之前設置命令文本? –

+0

另外,你正在'swith/case'語句中設置參數。你確定它們被設置爲CSV的每一行嗎? –

+0

這就是我一開始以爲的想法,但試圖在添加參數之前先加入命令文本,而沒有喜悅 - 再加上它對於我一直解析的其他文件一直工作正常。不管怎麼說,還是要謝謝你。 – Anonymous

回答

1

現在,您的代碼只會在找到選項卡(\t)時添加參數。如果每行不以選項卡結尾,則不會添加第二個參數。這可能是你的問題。

+0

有點困惑,因爲我注意到並修改了它,但仍然收到錯誤。但是,當我明確地設置參數像cmd.Parameters.Add(「@ code」,「Test」);等等,它的工作原理,因此必須在解析部分的某個地方出現錯誤,但我相信我會深入到底部。謝謝。 – Anonymous