1

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

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

我回到 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 方法之前,我已经完成了一个循环来计算数据读取器的行数。在我的测试查询中,我在数据阅读器中得到 4 行(正确的数量),只要我使用 datatable.load 方法,它就会说数据表是空的,这是怎么回事?!

###### 好的

因此,似乎数据读取器是单向的,遍历它以获取行数,就任何其他代码而言,它基本上是空的。没有意识到它只是向前的,并且一旦通读就不会“重置”。

4

1 回答 1

1

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

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

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

cm.ExecuteReader(CommandBehavior.CloseConnection);
于 2010-04-06T17:58:39.573 回答