参数超出范围
我要文件导入的.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:索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引。为什么会发生?
你的查询有4个参数:
string InsertQuery = "INSERT INTO Records(Record_Number, Type_Service, Duration, Record_Price) VALUES(?, ?, ?, ?)";
但你永远只加一个参数:
FbCom.Parameters.AddWithValue("Record_Number", csv[i]);
FbCom.ExecuteNonQuery();
如果显示堆栈跟踪(这你基本上丢掉你的异常处理,顺便说一句)我们可以确认,但是我的猜测是它正在寻找你没有提供的下一个参数,那就是它超出索引范围的地方。
你要么需要提供你所有的查询希望使用不同的查询参数。也许你打算为其他参数提供默认值?如果数据库设置为在没有提供默认值时,那是一回事。但在这种情况下,查询本身仍然期待着它们。
我换成CSV [I]与它的实际价值,但现在我得到“System.NullReferenceException:对象不设置到对象的实例”这条线: FbCom.Parameters.AddWithValue(“Record_Number”,CSV [1]); – 2012-07-28 10:48:54
@ВладиславНайденов:这只意味着你的一个对象是'null'。哪一个?另外,你为什么做这个改变?您的数组索引器是否也会导致问题?看起来你只是猜测和改变代码中的随机事物,而不是遵循任何逻辑调试过程。 – David 2012-07-28 10:59:52
我进行更改,因为CSV [1],CSV [3],CSV [4]和CSV [5]是,我想在数据库导入.csv文件的列。 – 2012-07-28 12:47:33
您的参数未命名。您将需要使用其索引,或者将您的查询转换为使用命名参数。 (和大卫说的)。 – 2012-07-26 18:40:05