Reader.Read() не может прочитать строки, даже если в нем есть строки

У меня проблема, когда кажется, что читатель указывает, что у него есть строки из возвращенного SQL, но цикл while для читателя никогда не запускается. Я помещаю сообщение в ридер. Вызывает проверку и помещает окно сообщения в первую строку после цикла while. Окно сообщений для hasrows выполняется, но окно сообщений для Read не выполняется. Это очень загадочно. Я пробовал запрос к базе данных, и он действительно возвращает строки. Вот фрагмент кода.

using (DbConnection connection = CADBase.DbProviderFactory.CreateConnection())
    {
        connection.ConnectionString = CADBase.DbConnectionString;
        connection.Open();

        using (DbCommand command = connection.CreateCommand())
        {
            SQL = <statement here>;
            command.CommandText = SQL

            using (DbDataReader reader = command.ExecuteReader())
            {
                    while (reader.Read())
                    {
            //NEVER MAKES IT HERE
                    } 
    }
        }
    }

5 ответов

Решение

Для будущих читателей этого вопроса: обратите внимание, что проблема возникла из-за того, что OP возвращал слишком много столбцов в запросе. Смотрите комментарии ниже этого ответа.


Я не совсем уверен, почему это происходит, но вам действительно нужно проверять строки только один раз, а не дважды, и Read() метод уже делает это.

Так что все, что вам действительно нужно, это

while (reader.Read())
{
    // Do your thing
} 

Просто предположение. Возможно, вы обращаетесь к объекту чтения в этом окне сообщений, которое отображается после reader.HasRows и перед reader.Read(). Видимо, метод Read () возвращает true, только если читатель НЕ достиг последней строки (см.: /questions/29473749/sqldatareaderread-vsegda-vozvraschaet-false/29473762#29473762). Так что, если читатель находится в последнем ряду, он вернет false! Может быть, запрос возвращает только одну строку, и вы каким-то образом меняете внутреннее состояние объекта считывателя, обращаясь к нему (возможно, с помощью отладчика) и перемещая считыватель в последнюю строку?

Вызовите MoveNext() перед первым вызовом для чтения

Вы должны использовать свойство reader.HasRows, а не метод.

Может быть, вы получаете исключение на reader.Read(),

Но с тех пор HasRows это свойство, а не метод. Вам нужно написать if(reader.HasRows) чтобы сделать это скомпилировать.

if(reader.HasRows)
{           
    //MAKES IT HERE   
    while (reader.Read())
    {
        //NEVER MAKES IT HERE
    } 
} 

Так что мне интересно, что на самом деле код.

Другие вопросы по тегам