2012-07-26 105 views
1

我要文件導入的.csv與C#Firebird數據庫。爲此我寫了下面的代碼:參數超出範圍

private void button1_Click(object sender, EventArgs e) {    
    FbConnection FBConnect = new FbConnection(); 
    FBConnect.ConnectionString = global::MTel.Properties.Settings.Default.MTelConnectionString; 
    string s1 = "Изходящ разговор Корпоративна група "; 
    string s2 = "Изходящ SMS М-Тел "; 
    string s3 = "Изходящ SMS Виваком "; 
    string s4 = "Изходящ SMS Глобул "; 
    string s5 = "Мобилен Интернет "; 
    string s6 = "Мобилен Интернет Безплатен Трафик "; 
    string s7 = "Мобилен Интернет Vodafone live! в портала "; 
    string s8 = "Допълнителни услуги "; 
    string s9 = "Изходящ SMS Корпоративна група "; 
    string s10 = "Изходящ SMS Допълнителни услуги, нормална тарифа "; 
    string s11 = "Изходящ разговор Безплатни разговори "; 
    string s12 = "Изходящ разговор Спешни номера "; 
    string s13 = "Изходящ разговор Корпоративна група, пренасочване "; 
    string s14 = "Изходящ разговор Гласова поща "; 
    string s15 = "Изходящ разговор Гласова поща, пренасочване "; 
    string s16 = "MUSICALL "; 
    string s17 = "Изходящ разговор Обслужване на клиенти *88 "; 
    string s18 = "Телевизия и видео "; 
    string filePath = "D:\\MTel\\Test.csv"; 
    Records[] rec; 
    CsvReader csv = new CsvReader(new StreamReader(filePath), true); 
    int fieldCount = csv.FieldCount; 
    string[] headers = csv.GetFieldHeaders(); 
    string InsertQuery = "INSERT INTO Records(Record_Number, Type_Service, Duration,        Record_Price) VALUES(?, ?, ?, ?)"; 
    FbCommand FbCom = new FbCommand(InsertQuery, FBConnect); 
    try { 
    FBConnect.Open(); 
    while (csv.ReadNextRecord()) { 
     for (int i = 0; i < fieldCount; i++) { 
     if (csv[i].ToString() != s1 || csv[i].ToString() != s2 || 
      csv[i].ToString() != s3 || csv[i].ToString() != s4 || 
      csv[i].ToString() != s5 || csv[i].ToString() != s6 || 
      csv[i].ToString() != s7 || csv[i].ToString() != s8 || 
      csv[i].ToString() != s9 || csv[i].ToString() != s10 || 
      csv[i].ToString() != s11 || csv[i].ToString() != s12 || 
      csv[i].ToString() != s13 || csv[i].ToString() != s14 || 
      csv[i].ToString() != s15 || csv[i].ToString() != s16 || 
      csv[i].ToString() != s17 || csv[i].ToString() != s18) { 
      if (headers[i].ToString() == "Телефонен/Абонатен номер") { 
       FbCom.Parameters.AddWithValue("Record_Number", csv[i]); 
       FbCom.ExecuteNonQuery();        
      } else if (headers[i].ToString() == "Услуга и направление") { 
       FbCom.Parameters.AddWithValue("Type_Service", csv[i]); 
       FbCom.ExecuteNonQuery(); 
      } else if (headers[i].ToString() == "Количество (сек. бр. kB.)") { 
       FbCom.Parameters.AddWithValue("Duration", csv[i]); 
       FbCom.ExecuteNonQuery(); 
      } else if (headers[i].ToString() == "Такса (лв.)") { 
       FbCom.Parameters.AddWithValue("Record_Price", csv[i]); 
       FbCom.ExecuteNonQuery(); 
      } 
      } 
     } 
     } 
    } catch (FbException FbEx) { 
     MessageBox.Show(FbEx.ToString()); 
    } finally { 
     MessageBox.Show("Данни са успешно импортирани в базата данни", "Успешна операция", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     FBConnect.Close(); 
    } 
    } 
} 

但是對於線

FbCom.ExecuteNonQuery(); 

我收到System.ArgumentOutOfRangeException:索引超出範圍。必須是非負數且小於集合的大小。 參數名稱:索引。爲什麼會發生?

+1

您的參數未命名。您將需要使用其索引,或者將您的查詢轉換爲使用命名參數。 (和大衛說的)。 – 2012-07-26 18:40:05

回答

2

你的查詢有4個參數:

string InsertQuery = "INSERT INTO Records(Record_Number, Type_Service, Duration, Record_Price) VALUES(?, ?, ?, ?)"; 

但你永遠只加一個參數:

FbCom.Parameters.AddWithValue("Record_Number", csv[i]); 
FbCom.ExecuteNonQuery(); 

如果顯示堆棧跟蹤(這你基本上丟掉你的異常處理,順便說一句)我們可以確認,但是我的猜測是它正在尋找你沒有提供的下一個參數,那就是它超出索引範圍的地方。

你要麼需要提供你所有的查詢希望使用不同的查詢參數。也許你打算爲其他參數提供默認值?如果數據庫設置爲在沒有提供默認值時,那是一回事。但在這種情況下,查詢本身仍然期待着它們。

+0

我換成CSV [I]與它的實際價值,但現在我得到「System.NullReferenceException:對象不設置到對象的實例」這條線: FbCom.Parameters.AddWithValue(「Record_Number」,CSV [1]); – 2012-07-28 10:48:54

+0

@ВладиславНайденов:這隻意味着你的一個對象是'null'。哪一個?另外,你爲什麼做這個改變?您的數組索引器是否也會導致問題?看起來你只是猜測和改變代碼中的隨機事物,而不是遵循任何邏輯調試過程。 – David 2012-07-28 10:59:52

+0

我進行更改,因爲CSV [1],CSV [3],CSV [4]和CSV [5]是,我想在數據庫導入.csv文件的列。 – 2012-07-28 12:47:33