【发布时间】:2010-04-06 17:43:52
【问题描述】:
场景是这样的;我有一个 sqldatareader 查询,当我尝试使用 datatable.load 将 sqldatareader 转换为数据表时,它似乎没有返回任何内容。
所以我对其进行调试,在详细的 SQL 查询进入 sqldatareader 之前获取它,以确保其格式正确。我将其复制并粘贴到 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 方法,它就会说数据表是空的,这是怎么回事?!
###### 好的所以看起来数据读取器是一种单向的东西,遍历它以获取行数,就任何其他代码而言,它基本上是空的。没有意识到它只是向前的,并且一旦通读就不会“重置”。
【问题讨论】:
-
由于 VB.Net 的解析方式(因为缺少更好的术语),我看到了非常相似的结果...尝试使用“明显”的语法机制,例如 [] 围绕表名和/或 SQL 语句中的列名等...您也可以尝试使用 SqlDataAdapter (.fill) 而不是 .load 并查看数据是否显示。
-
是的,SqlDataReader 是只进的,正如文档所说:“提供了一种从 SQL Server 数据库中读取只进的行流的方法”。 msdn.microsoft.com/en-us/library/…
标签: sql vb.net sqldatareader