【问题标题】:VB.net Debug sqldatareader - immediate windowVB.net 调试 sqldatareader - 即时窗口
【发布时间】: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


【解决方案1】:

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

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

另外,通过将 cm.ExecuteReader() 更改为:

确保您的连接已关闭
cm.ExecuteReader(CommandBehavior.CloseConnection);

【讨论】:

猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2013-02-06
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多