.HasRows()函数在数据读取器上永远占用

时间:2017-10-12 14:26:04

标签: vb.net odbcdatareader

我有一些简单的代码,if语句检查数据读取器的HasRows,出于某种原因,当我在Visual Studio 2017中运行代码时,需要永远评估并返回答案(写这篇文章时,我的代码已经运行了4分钟)。有什么建议吗?

 Dim cmd As OdbcCommand
 Dim rdr As OdbcDataReader

cmd = New OdbcCommand("select GLPN,GLFY,GLDCT,GLDOC,GLCO,GLDGJ,GLANI,GLSBL,GLLT,GLCRCD,GLAA,GLU,GLGLC,GLEXA,GLICUT,GLR2,GLR1,GLSFX,GLOKCO" _
                      & ",GLEXR,GLODOC,GLPKCO,GLPDCT,GLCN,GLDKJ,GLVINV,GLIVD,GLPO,GLDCTO,GLLNID,GLTORG,GLAN8,GLICU,GLOPSQ,GLJBCD" _
                      & ",GLACR,GLABR2,GLABR1,GLDGJ,GLLT,GLCRCD,GLEXA,GLICUT,GLEXR,GLDKJ,GLIVD,GLAN8,GLICU,GLACR,GLKCO,GLSBLT,GLOBJ,GLSUB,GLJELN,GLEXTL,GLCRR,GLBCRC" _
                      & " from " _
                      & "PRODDTA.F0911 where GLPOST = 'P' and GLDGJ >= ? and GLDGJ <= ? and (GLLT = 'AA' or GLLT = 'CA') and GLDOC = 206940", cnn)
cmd.Parameters.Add("?GLUPMJs", OdbcType.Int).Value = todaysdate - 14
cmd.Parameters.Add("?GLUPMJe", OdbcType.Int).Value = todaysdate
cnn.Open()
cmd.CommandTimeout = 300
rdr = cmd.ExecuteReader

If rdr.HasRows() Then

    'Do a bunch of stuff

End if

Edit1:仍然得到了有趣的问题,但我注意到它只在一个地方,我有“HasRows()”检查多个点,它正在快速工作3毫秒等。它只在一个查询上。

Edit2:我上面提到的查询在上次尝试时在SQL开发人员上非常快地运行1.202秒,它也没有返回任何消息。

Edit3:我想知道它是否与我返回的字段数量有关,在这一行上快速运行的其他查询返回的字段数要少得多。

4 个答案:

答案 0 :(得分:1)

这可能不会加快速度,但你试过吗?

While rdr.Read()
'Do a bunch of stuff
End While

编辑:

Dim dt As DataTable = New DataTable
dt.Load(rdr)
If dt.Rows.Count >= 0 Then
   'Do a bunch of stuff
End If

答案 1 :(得分:0)

问题可能是查询需要执行很多工作。如果您只想检查是否存在记录,则可以使用“SELECT TOP 1 1”执行查询,并使用ExecuteScalar代替ExecuteReader

答案 2 :(得分:0)

您似乎并不是唯一一个遇到HasRows方法问题的人。在this帖子中,OP表示该方法存在问题,尽管它是SQL-SERVER。但我认为解决方案可能很有用,因为两个DataReader都继承自同一个类并且它们密切相关。

如果您阅读了他们在问题和最多投票答案中引用的帖子,您会看到他们断定HasRows SQL查询执行时返回的错误行为不仅显示了一些数据结果,也是一条消息。他们最终使用另一种方法来检查基于Read()方法的数据读取器上是否有任何数据,这被证明更可靠。

在他们的情况下,问题是当读者实际包含数据时HasRows属性设置为false,但可能与您的性能问题有关。您一定要尝试使用Read方法,以确保您的查询不是问题。

P.S:另一个有趣的link,其中一个人报告了同样的问题。

答案 3 :(得分:0)

HasRows()延迟的原因是因为ExecuteReader实际上没有执行查询,它会延迟执行直到需要它为止。 HasRows是执行它的人。感谢Dwillis指出它。

我通过在它前面加上一行代码测试了这一点,这就是延迟时间和hasRows运行时的速度很快。

有趣的是,在Sql Management Studio中运行相同的sql会在1.5秒内运行并返回所有行,但在代码中它始终是一个不同的问题,但也可能是由于ODBC设置。