2009-01-20 2 views
0

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

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

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

return r; 
} 

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

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

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

Большое спасибо.

ответ

1

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

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

+0

Есть ли документация, подтверждающая это? Мне просто интересно узнать об этом немного подробнее. – Rocco

+0

Вот хорошее сравнение DataReader и DataSet: http://msdn.microsoft.com/en-us/library/ms971481.aspx#adonetbest_topic3. –

1

Я вижу вид напротив. Я

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

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

Смежные вопросы