DataReader имеет строки и данные, пытаясь прочитать из них, что «нет данных» - PullRequest
4 голосов
/ 27 июня 2011

Я давно не пользовался DataReaders (я предпочитаю использовать ORM), но я вынужден работать.Я оттягиваю строки и проверяю, что HasRows верно;отладка на этом этапе и проверка читателя показывает, что мои данные там есть.

Теперь вот проблема: в тот момент, когда я звоню reader.Read(), попытка расширить результаты говорит: «Перечисление не дало никаких результатов» или что-то еще,и я получаю «Недопустимая попытка чтения, когда нет данных».ошибка.Я получаю то же самое, если не вызываю Read() (по умолчанию, так как DataReader запускается до первой записи).

Я не могу вспомнить правильный способ справиться с этим;данные там , когда я проверяю HasRows, но они исчезают в тот момент, когда я пытаюсь прочитать их сразу после или после вызова Read, что не имеет смысла, как если бы я не звонилRead, читатель все еще должен быть перед первой записью, и если установлено свойство, которое запускает его с первой записи (SingleRow? Я забыл его имя), то я должен иметь возможность читать строки без вызоваПрочитайте, однако оба пути, кажется, перемещают мимо строки, содержащей данные.

Что я забыл?Код довольно прост:

TemplateFile file = null;
using (DbDataReader reader = ExecuteDataReaderProc("GetTemplateByID", idParam)) 
{ 
    if (reader.HasRows) // reader has data at this point - verified with debugger
    { 
        reader.Read(); // loses data at this point if I call Read()
        template = new TemplateFile 
        {
            FileName = Convert.ToString(reader["FileName"]) // whether or not I call
                                                            // Read, says no data here
        };
    }
}

Ответы [ 2 ]

10 голосов
/ 27 июня 2011

Просто, чтобы уточнить ответ, он использовал отладчик, поскольку расширение представления результатов вызывает Read(), и поэтому он перемещается за строку.Как сказал Марк Гравелл в комментарии: Отладчик считается вредным

0 голосов
/ 27 июня 2011

Если вы хотите поместить данные в файл, начните с загрузки DataTable вместо использования DataReader.С DataReader, как было упомянуто в комментариях, вы можете перебрать набор результатов с циклом while

while (reader.Read())
{

}

Цикл читает по одной строке за раз и завершает работу, когда все строки прочитаны.После перехода к следующей строке предыдущие строки больше не будут доступны, пока вы не поместите их в какую-либо другую структуру, например в список или таблицу данных.

Но вы можете использовать DataAdapater для заполнения таблицы данных, чтобыНе быть причиной для использования DataReader.Затем вы можете записать в файл из DataTable.

В любом случае, я не вижу, как эта строка может работать.

FileName = Convert.ToString(reader["FileName"])

Я могу опубликовать дополнительный код для любого подхода, если хотите.HTH Харви Сатер

...