OracleDataReader теряет результаты после проверки

Я наткнулся на причудливую «особенность» в Visual Studio, и мне было интересно узнать, заметил ли это кто-нибудь еще. Или, если это конкретно для меня.

У меня есть несколько методов, которые выполняют SQL-запросы к базе данных, а затем возвращают OracleDataReader

method()
{
OracleCommand cmd = new command(query, connection);
OracleDataReader r = cmd.ExecuteReader();

return r;
}

Когда я отлаживаю код, использующий этот метод. Я могу щелкнуть непубличные члены, чтобы просмотреть строки результатов. Однако, как только я просмотрел эти результаты, я попытался выполнить функцию reader.Read () в OracleDataReader не дал никаких результатов. Проверка результатов в представлении отладчика показывает, что средство чтения пусто.

Каждый раз, когда я не проверяю результаты, код, выполняющий Read, работает без проблем.

Я не нашел подтверждений этого через Google, но мои навыки поиска часто оставляют желать лучшего. Если бы кто-нибудь мог подтвердить это на собственной системе или пролить свет на причины, я был бы очень признателен.

Огромное спасибо.

🤔 А знаете ли вы, что...
C# имеет механизм исключений для обработки ошибок и исключительных ситуаций.


1 076
2

Ответы:

Решено

Объекты ADO.NET, производные от IDataReader (например, OracleDataReader), предоставляют подключенный прямой доступ к данным, возвращаемым запросом, поэтому, когда вы просматриваете результаты в визуализаторе отладки, вы фактически переходите через реальные данные. Когда программа запускается, DataReader прошел итерацию мимо данных и сообщает (правильно), что теперь он пуст.

Если вам нужна гибкость для просмотра данных в отладчике, вы можете рассмотреть возможность использования отключенного класса с произвольным доступом к данным, такого как DataSet или DataTable.


Я вижу как бы противоположное. я делаю

    OracleDataReader reader = cmd.ExecuteReader();
    return reader;
    .... return it up the stack a couple more levels;

Если я не вызываю reader.hasRows на каждом уровне стека, мои результаты меняются, и я получаю нулевые указатели, когда пытаюсь получить к ним доступ.