我有一些简单的代码,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:我想知道它是否与我返回的字段数量有关,在这一行上快速运行的其他查询返回的字段数要少得多。
答案 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设置。