我必须使用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。为什么会这样?
答案 0 :(得分:2)
您的查询有4个参数:
string InsertQuery = "INSERT INTO Records(Record_Number, Type_Service, Duration, Record_Price) VALUES(?, ?, ?, ?)";
但你只需要添加一个参数:
FbCom.Parameters.AddWithValue("Record_Number", csv[i]);
FbCom.ExecuteNonQuery();
如果您显示堆栈跟踪(顺便说一下,您在异常处理中实际上已丢弃)我们可以确认,但我的猜测是它正在寻找您未提供的下一个参数那就是它超出索引界限的地方。
您需要提供查询期望使用不同查询的所有参数。也许您打算为其他参数提供默认值?如果数据库设置为在没有提供时具有默认值,那么这是一回事。但在这种情况下,查询本身仍然期待它们。