Я искал повсюду, но большинство пар проблема/ответ Datareader касаются прохождения первой строки, ничего не возвращая, получения одиночных значений с помощью datareader и т. д. Ничего похожего на то, с чем я сталкиваюсь в данный момент.
Чтобы было ясно, это задание для моего вечернего класса, хотя и очень небольшая его часть.
функция принимает размер как int; таблица имеет два столбца: col1 и col2, из которых col1 содержит значение индекса как двойное, а col2 содержит случайно сгенерированное двойное значение. таблица - это рабочий лист Excel в книге, не знаю, актуально ли это.
таблица была заполнена с помощью оператора вставки, выполненного объектом команды ADO без проблем.
Теперь вместо того, чтобы предоставлять мне количество строк, указанное в запросе как size/@size (поскольку в данном случае он играет двойную роль индекса/UID), объект чтения данных извлекает, казалось бы, случайное количество строк. Я говорю «по-видимому», потому что число, похоже, фиксировано на значении «размер» (например, size = 10 -> datareader содержит 3 строки после .executeReader(); size = 2 -> datareader содержит 113 строк; size = 5 -> 446 строк).
Во время отладки я отслеживал параметр @size для запроса, который остается 10.0, и я не могу понять, когда и почему reader.Read() становится False.
Я также заменил параметр в строке запроса литералом (5.0); что привело к несоответствию типа в исключении выражения критерия. Но это все дубли, или я что-то упускаю?! Я предполагаю, что это каким-то образом будет кикером, но сейчас я в растерянности.
Как вы, наверное, догадались, я новичок в программировании, так что потерпите меня, пожалуйста.
Что заставляет мой код вести себя именно так?
private Double[] getSelection(int size, string table)
{
List<Double> list = new List<Double>();
Double[] toSort;
OleDbConnection connect = new OleDbConnection(cntstring);
connect.Open();
OleDbCommand command = connect.CreateCommand();
command.CommandType = CommandType.Text;
command.Parameters.Add("@size", OleDbType.Double).Value = Convert.ToDouble(size);
command.CommandText = String.Format("SELECT * FROM [{0}$] WHERE col1 < @size;", table);
try
{
OleDbDataReader reader = command.ExecuteReader();
Double outputReader;
while (reader.Read())
{
outputReader = Convert.ToDouble(reader.GetValue(1)); /for some reason (which is not my main concern at the moment) the reader.getDouble() method returned an invalid cast exception
list.Add(outputReader);
}
toSort = new double[list.Count()];
foreach (double d in list)
{
toSort[list.IndexOf(d)] = d;
}
string output = String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", toSort[0], toSort[1], toSort[2], toSort[3], toSort[4], toSort[5], toSort[6], toSort[7], toSort[8], toSort[9]);
//to check for values; the String.Format is where i first encountered the index out of bounds exception
MessageBox.Show(output);
reader.Close();
reader.Dispose();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
finally
{
connect.Close();
connect.Dispose();
return toSort;
}
}