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'
Другие вопросы по тегам