1

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();
    }
  }
}

しかし、ラインのために

FbCom.ExecuteNonQuery();

System.ArgumentOutOfRangeException: Index was out of range を取得しています。負ではなく、コレクションのサイズより小さくなければなりません。パラメーター名: インデックス。なぜそれが起こるのですか?

4

1 に答える 1

2

クエリには4つのパラメータがあります。

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

ただし、追加するパラメータは1つだけです。

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

スタックトレース(ちなみに、例外処理で本質的に破棄している)を表示すると、確認できる場合がありますが、指定していない次のパラメーターを探していると思います。どこかでインデックス境界を超えています。

クエリが別のクエリを使用することを期待しているすべてのパラメータを指定する必要があります。おそらく、他のパラメータにデフォルト値を提供するつもりですか?何も指定されていないときにデータベースがデフォルト値を持つように設定されている場合、それは1つのことです。しかし、この場合、クエリ自体はまだそれらを期待しています。

于 2012-07-26T18:24:26.560 に答える