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! Может быть, запрос возвращает только одну строку, и вы каким-то образом меняете внутреннее состояние объекта считывателя, обращаясь к нему (возможно, с помощью отладчика) и перемещая считыватель в последнюю строку?
Может быть, вы получаете исключение на reader.Read()
,
Но с тех пор HasRows
это свойство, а не метод. Вам нужно написать if(reader.HasRows)
чтобы сделать это скомпилировать.
if(reader.HasRows)
{
//MAKES IT HERE
while (reader.Read())
{
//NEVER MAKES IT HERE
}
}
Так что мне интересно, что на самом деле код.