Datareader содержит, казалось бы, случайное количество строк, несмотря на критерии оператора Select
Я искал повсюду, но большинство пар проблем / ответов Datareader касается прохождения первой строки, ничего не возвращая, получения отдельных значений с использованием datareader и т. Д. Ничего подобного тому, с чем я сталкиваюсь в данный момент.
Чтобы было ясно, это задание для моего вечернего урока, хотя и очень небольшая его часть.
функция принимает размер как int; таблица имеет два colmun: col1 и col2, из которых col1 содержит значение индекса как double, а col2 содержит случайно сгенерированный double. Таблица - это лист Excel в книге, не знаю, насколько это актуально.
таблица была заполнена с помощью оператора вставки, выполненного объектом команды ADO без проблем.
Теперь вместо того, чтобы указывать мне количество строк, указанное в запросе size/@size (поскольку в этом случае он играет двойную роль index/UID), объект datareader выбирает, казалось бы, случайное количество строк. Кажется, я говорю, потому что число, кажется, зафиксировано в значении "size" (например, 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;
}
}
1 ответ
Вы пробовали одинарные кавычки вокруг @size в своем операторе select, т.е.
'@size'