Datareader содержит, по-видимому, случайное количество строк, несмотря на критерии оператора Select.

Я искал повсюду, но большинство пар проблема/ответ 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;
        }
    }

person Gerald V.    schedule 19.02.2015    source источник
comment
Можете ли вы показать свою строку подключения? Я хотел бы проверить вашу стоимость IMEX. А как насчет проверки того, действительно ли ваш столбец Excel отформатирован как двойной, а не как строка?   -  person Steve    schedule 20.02.2015
comment
Я читал, что excel по умолчанию хранит числа как двойные, поэтому используется двойной тип. строка подключения: @Provider=Microsoft.ACE.OLEDB.12.0;Источник данных= C:\Users*****\Documents\Visual Studio 2013\Projects\prog3Les2EigenMakelijADO\prog3Les2EigenMakelijADO\EigenMakelij.xlsx; Расширенные свойства = «Excel 12.0 Xml»; Как видите, значения IMEX нет. Это обязательно?   -  person Gerald V.    schedule 20.02.2015
comment
Чтение данных Excel через OleDb является больным вопросом. См. этот комментарий на www.connectionstrings.com   -  person Steve    schedule 20.02.2015
comment
А пока: добавлен HDR=YES; IMEX=1 для расширенных свойств и окруженного пути с одинарными кавычками › те же результаты.   -  person Gerald V.    schedule 20.02.2015
comment
Или прочитайте здесь stackoverflow .com/questions/10102149/   -  person Steve    schedule 20.02.2015
comment
спасибо за тех. Для других, если они когда-либо попадут на этот вопрос, я также нашел это очень информативным в codeproject, хотя я еще не смог заставить его работать. Тип не соблюдается, когда выполняется INSERT... to sheet, пишется текст на лист, независимо от моей настройки constring, что позже разрушит критерий SELECT. Но эта штука со строкой подключения щекочет мое обсессивно-компульсивное расстройство. когда у меня будет больше свободного времени, я буду копать глубже. Когда найду отпишусь   -  person Gerald V.    schedule 21.02.2015


Ответы (1)


Вы пробовали использовать одинарные кавычки вокруг @size в своем операторе выбора, т.е.

'@size'
person Wignu    schedule 19.02.2015
comment
Параметры никогда не заключаются в кавычки. Таким образом, они становятся буквальными строками. - person Steve; 20.02.2015