2010-04-06 4 views
1

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

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

Я возвращаюсь в визуальную студию и продолжаю программу, создаю datatable и пытаюсь загрузить 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) 

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

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

######### UPDATE ############

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

######### ДАЛЕЕ UPDATE ############

Ok Я сделал цикл для подсчета строк в DataReader перед использованием метод datatable.load. В моем тестовом запросе я получаю 4 строки (правильное количество) в datareader, как только я использую метод datatable.load, он говорит, что datatable пуст, что происходит ?!

###### Ok

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

+0

Я видел очень похожие результаты из-за того, что VB.Net анализирует (из-за отсутствия лучшего термина) ... Попробуйте использовать «очевидные» синтаксические механизмы для использования, такие как [] вокруг табличных имен и/или столбцов в столбце SQL и т. Д. Вы также можете попробовать использовать SqlDataAdapter (.fill) вместо .load и посмотреть, показывают ли данные вверх. – tobrien

+0

Да, SqlDataReader работает только вперед, поскольку в документации говорится: «Предоставляет способ чтения прямого потока строк из базы данных SQL Server». http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx –

ответ

1

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

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

Кроме того, убедитесь ваше соединение закрывается путем изменения cm.ExecuteReader() для:

cm.ExecuteReader(CommandBehavior.CloseConnection); 
+1

Также убедитесь, что вы закрыли DataReader, когда закончите с ним. http://msdn.microsoft.com/en-us/library/haa3afyz(VS.80).aspx – DOK

+0

ОК, попробуем все вышеперечисленное и посмотрим, как я пойду, спасибо! – 2010-04-07 09:13:47

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