场景是这样的;我有一个 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 方法,它就会说数据表是空的,这是怎么回事?!
###### 好的因此,似乎数据读取器是单向的,遍历它以获取行数,就任何其他代码而言,它基本上是空的。没有意识到它只是向前的,并且一旦通读就不会“重置”。