VB.net Debug sqldatareader - 即时窗口

时间:2010-04-06 17:43:53

标签: sql vb.net sqldatareader

情景就是这样;当我尝试使用datatable.load将sqldatareader转换为数据表时,我有一个sqldatareader查询似乎没有返回任何内容。

所以我调试它,我在进入sqldatareader之前获取详细的SQL查询,只是为了确保它的格式正确。我将其复制并粘贴到SQL服务器中以运行它并查看它是否返回任何内容。确实如此。

我回到visual studio并让程序继续,我创建一个数据表并尝试加载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 server并运行它,我得到一行结果。

任何想法我做错了什么?

#########更新############

我现在已经注意到它似乎比每次SQL查询返回的行少一行。所以,如果我自己运行SQL并得到1行,那么数据表似乎有0行。如果查询返回4行,则数据表有3行!很奇怪,有什么想法吗?

#########进一步更新############

好的我在使用datatable.load方法之前已经完成了一个循环来计算datareader的行数。在我的测试查询中,我在datareader中得到4行(正确的数量),一旦我使用datatable.load方法,它就说数据表是空的,发生了什么?!

###### 好

因此,似乎数据引导器是单向的,迭代它以获得行计数,就其他任何代码位而言,它基本上是空的。没有意识到它只是前进,一旦通读就不会“重置”。

1 个答案:

答案 0 :(得分:1)

在dt.load(dr)上方插入此行,检查调试窗口中的值:

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

还要确保通过将cm.ExecuteReader()更改为:

来关闭连接
cm.ExecuteReader(CommandBehavior.CloseConnection);