C# 4.0 参数超出范围

C# 4.0 参数超出范围,c#-4.0,csv,import,firebird,C# 4.0,Csv,Import,Firebird,我必须用C#将.csv文件导入firebird数据库。为此,我编写了以下代码: private void button1_Click(object sender, EventArgs e) { FbConnection FBConnect = new FbConnection(); FBConnect.ConnectionString = global::MTel.Properties.Settings.Default.MTelConnectionString

我必须用C#将.csv文件导入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();
    }
  }
}
我正在获取System.ArgumentOutofRange异常:索引超出范围。必须为非负数且小于集合的大小。
参数名称:索引。为什么会发生这种情况?

您的查询有4个参数:

string InsertQuery = "INSERT INTO Records(Record_Number, Type_Service, Duration, Record_Price) VALUES(?, ?, ?, ?)";
但您只能添加一个参数:

FbCom.Parameters.AddWithValue("Record_Number", csv[i]);
FbCom.ExecuteNonQuery();
如果您显示堆栈跟踪(顺便说一下,您在异常处理中基本上丢弃了堆栈跟踪),我们可能可以确认,但我猜它正在查找您未提供的下一个参数,这就是它超出索引边界的地方


您需要提供您的查询希望使用不同查询的所有参数。也许您打算为其他参数提供默认值?如果数据库设置为在没有提供任何值的情况下具有默认值,这是一件事。但是在这种情况下,查询本身仍然需要它们。

您的参数未命名。您需要使用它们的索引,或者将查询转换为使用命名参数。(还有David所说的)。我用它的实际值替换了csv[I],但现在我得到了此行的“System.NullReferenceException:对象引用未设置为对象的实例”:FbCom.Parameters.AddWithValue(“记录编号”,csv[1])@那只意味着你的一个对象是
null
。是哪一个?还有,你为什么要做出这样的改变?数组索引器是否也会导致问题?似乎您只是猜测和更改代码中的随机内容,而不是遵循任何逻辑调试过程。我之所以进行更改,是因为csv[1]、csv[3]、csv[4]和csv[5]是我要导入到数据库中的.csv文件的列。@Бааааааааааааааааа。根据问题中的代码,您只向查询添加了一个参数,但它需要四个。更改一个参数或以不同的方式指定它不会改变您仍然只添加一个而不是四个参数的事实。
FbCom.Parameters.AddWithValue("Record_Number", csv[i]);
FbCom.ExecuteNonQuery();