参数超出范围

问题描述:

我要文件导入的.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

你的查询有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