VB.net Debug sqldatareader - немедленное окно

Сценарий таков; У меня есть запрос sqldatareader, который, похоже, ничего не возвращает, когда я пытаюсь преобразовать sqldatareader в таблицу данных с помощью datatable.load.

Итак, я отлаживаю его, я беру подробный SQL-запрос до того, как он попадет в sqldatareader, просто чтобы убедиться, что он правильно отформатирован. Я копирую и вставляю это на SQL-сервер, чтобы запустить его и посмотреть, вернет ли он что-нибудь. Так и есть, один ряд.

Я возвращаюсь в визуальную студию и позволяю программе продолжать работу, я создаю таблицу данных и пытаюсь загрузить sqldatareader, но он просто возвращает пустой считыватель. Я сбит с толку тем, что происходит.

Я скопирую версию кода (не точный SQL-запрос, который я использую, но близкий) здесь:

Dim cn As New SqlConnection
cn.ConnectionString = <connection string details here>
cn.Open()
Dim sqlQuery As String = "select * from Products where productid = 5"
Dim cm As New SqlCommand(sqlQuery, cn)
Dim dr As SqlDataReader = cm.ExecuteReader()

Dim dt as new DataTable
dt.load(dr)

dt должен иметь содержимое, но он пуст. Если я скопирую этот SQL-запрос на сервер sql и запущу его, я получу ряд результатов.

Любые идеи, что я делаю неправильно?

######### ОБНОВЛЕНИЕ ############

Теперь я заметил, что он, похоже, возвращает на одну строку меньше, чем я получаю с каждым SQL-запросом. Итак, если я сам запускаю SQL и получаю 1 строку, то в таблице данных будет 0 строк. Если запрос возвращает 4 строки, в таблице данных их 3!! Очень странно, есть идеи?

######### ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ #############

Хорошо, я сделал цикл для подсчета строк устройства чтения данных перед использованием метода datatable.load. В моем тестовом запросе я получаю 4 строки (правильное количество) в устройстве чтения данных, как только я использую метод datatable.load, он говорит, что таблица данных пуста, что происходит?!

###### Ok

Таким образом, кажется, что устройство чтения данных - это односторонняя вещь, итерация по нему, чтобы получить количество строк, и она по существу пуста, если речь идет о любом другом фрагменте кода. Не понимал, что это было только вперед и не «сбрасывалось» после прочтения.


person Community    schedule 06.04.2010    source источник
comment
Я видел очень похожие результаты из-за того, как VB.Net анализирует (из-за отсутствия лучшего термина)... Попробуйте использовать очевидные синтаксические механизмы, такие как [] вокруг имен таблиц и/или имен столбцов в операторе SQL и т. д. ... Вы также можете попробовать использовать SqlDataAdapter (.fill) вместо .load и посмотреть, появятся ли данные.   -  person tobrien    schedule 06.04.2010
comment
Да, SqlDataReader предназначен только для прямого чтения, как сказано в документации: Предоставляет способ чтения прямого потока строк из базы данных SQL Server. msdn.microsoft.com/en-us/library/   -  person Chris Haas    schedule 07.04.2010


Ответы (1)


Вставьте эту строку выше dt.load(dr), проверьте значение в окне отладки:

Debug.WriteLine("Datareader has rows: " & dr.HasRows)

Также убедитесь, что ваше соединение закрыто, изменив cm.ExecuteReader() на:

cm.ExecuteReader(CommandBehavior.CloseConnection);
person ZippyV    schedule 06.04.2010
comment
Также не забудьте закрыть DataReader, когда закончите с ним работать. msdn.microsoft.com/en-us/library/haa3afyz (VS.80).aspx - person DOK; 06.04.2010