Я наткнулся на причудливую «особенность» в Visual Studio, и мне было интересно узнать, заметил ли это кто-нибудь еще. Или, если это конкретно для меня.
У меня есть несколько методов, которые выполняют SQL-запросы к базе данных, а затем возвращают OracleDataReader
method()
{
OracleCommand cmd = new command(query, connection);
OracleDataReader r = cmd.ExecuteReader();
return r;
}
Когда я отлаживаю код, использующий этот метод. Я могу щелкнуть непубличные члены, чтобы просмотреть строки результатов. Однако, как только я просмотрел эти результаты, я попытался выполнить функцию reader.Read () в OracleDataReader не дал никаких результатов. Проверка результатов в представлении отладчика показывает, что средство чтения пусто.
Каждый раз, когда я не проверяю результаты, код, выполняющий Read, работает без проблем.
Я не нашел подтверждений этого через Google, но мои навыки поиска часто оставляют желать лучшего. Если бы кто-нибудь мог подтвердить это на собственной системе или пролить свет на причины, я был бы очень признателен.
Огромное спасибо.
🤔 А знаете ли вы, что...
C# имеет механизм исключений для обработки ошибок и исключительных ситуаций.
Объекты ADO.NET, производные от IDataReader (например, OracleDataReader), предоставляют подключенный прямой доступ к данным, возвращаемым запросом, поэтому, когда вы просматриваете результаты в визуализаторе отладки, вы фактически переходите через реальные данные. Когда программа запускается, DataReader прошел итерацию мимо данных и сообщает (правильно), что теперь он пуст.
Если вам нужна гибкость для просмотра данных в отладчике, вы можете рассмотреть возможность использования отключенного класса с произвольным доступом к данным, такого как DataSet или DataTable.
Я вижу как бы противоположное. я делаю
OracleDataReader reader = cmd.ExecuteReader();
return reader;
.... return it up the stack a couple more levels;
Если я не вызываю reader.hasRows
на каждом уровне стека, мои результаты меняются, и я получаю нулевые указатели, когда пытаюсь получить к ним доступ.