【问题标题】:SQLDataReader - no resultsSQLDataReader - 没有结果
【发布时间】:2012-05-22 19:42:43
【问题描述】:

请查看以下架构:

CREATE TABLE Person (id int not null identity,[index] varchar(30),datecreated datetime)

insert into Person ([index],datecreated) values ('4,5,6','2011-01-01')
insert into Person ([index],datecreated) values ('1,2,3','2011-02-02')
insert into Person ([index],datecreated) values ('7,8','2012-02-02')

以及下面的代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            Dim _ConString As String = WebConfigurationManager.ConnectionStrings("dbConnection").ConnectionString
            Dim connection As New SqlConnection(_ConString)
            Dim objCommand As New SqlCommand
            Dim objDR As SqlDataReader
            Dim sqlString As String

            sqlString = "SELECT * FROM Person WHERE datecreated < '2012-01-01' "


            objCommand.CommandText = sqlString & " ORDER BY left (substring([index],charindex(',',[index])+1,200),  " & _
            " charindex(',',substring([index],charindex(',',[index])+1,200))-1)"
            objCommand.Connection = connection
            connection.Open()
            objDR = objCommand.ExecuteReader
            If objDR.HasRows Then
                MsgBox("Has Rows")
            Else
                MsgBox("No Rows")
            End If
            connection.Close()
        Catch ex As Exception

        End Try

    End Sub

此代码是实时系统中功能的一部分。每当我使用 ORDER BY 以开发模式(或实时)运行完整应用程序时; DataReader 没有记录,并且出现一个消息框,显示 No Rows(当我单独运行上述代码时不会发生这种情况)。注释掉 ORDER BY 子句后返回正确的行数。没有抛出异常。有没有办法查看 SQLDataReader 是否产生了错误?

更新 请不要发布有关内存泄漏的答案,例如连接未关闭等或未处理异常的事实。我意识到这一点。我生成了上面的代码来尝试重现问题。

UPDATE2 2012 年 5 月 23 日 19:30 格林威治标准时间 我已经做了一些进一步的测试,发现当使用参数化查询时会出现差异,即在执行命令对象后,一行将在 SQL Studio 管理器中返回,但不会在应用程序中返回。我知道参数化查询被缓存。参数化执行计划可能与无参数化执行计划不同的原因是什么?

【问题讨论】:

  • 如果你只使用order by [index],或者通过其他属性订购会发生什么?
  • @Jon Skeet,谢谢。它以正确的顺序返回两行(没问题)
  • @w0051977:好的-所以我怀疑如果计算其排序“键”出错,则一行被“删除”,基本上-例如因为您正在使用超出范围的子字符串。
  • @Jon Skeet,这是我的第一个想法,但似乎并非如此。 SQLDataReader 上是否有一个属性可以告诉我这是否发生了?

标签: asp.net .net sql sql-server


【解决方案1】:

我怀疑ORDER BY 忽略了行投影到键导致失败的任何行。例如,您在该顺序中使用了许多字符串操作,包括子字符串。如果子字符串参数超出字符串范围会怎样?

我建议你试试:

SELECT [insert order by projection here] FROM Person

看看会发生什么那里 - 从等式中删除 ORDER BY。我还建议您从 SQL Management Studio(或其他)中执行此操作,而不是通过代码进行试验 :)

【讨论】:

  • @w0051977: ORDER BY 的原版,还是“只需选择订购键”的版本?
  • 您能否提出进一步调查的方法?
  • 尝试创建一个存储过程,并调用该存储过程,而不仅仅是原始 SQL。这应该有助于同步来自应用程序的查询和来自 Management Studio 内部的查询之间的差异。
  • @Jon Skeet,我已经更新了我的问题(更新 2)。你能看看吗?根据我是使用参数化查询还是无参数化查询,查询结果会有所不同。
【解决方案2】:

为了进一步调查,我建议使用 SQL Profiler。除了 SQL 查询计划之外,您不仅可以看到来自应用程序的确切查询,而且还可以返回任何可能生成(但未返回)的错误。

【讨论】:

  • 谢谢。您知道是否有理由根据使用参数化查询还是非参数化查询以不同的方式优化查询?
  • 以不同方式优化查询的原因有很多 - 获取两者的查询计划将有助于调查。
  • 谢谢。由于建议使用 SQL Profiler,我已将此标记为正确答案。使用 SQL Profiler,我能够看到查询针对参数化查询和非参数化查询进行了不同的优化。使用参数化查询;执行计划显示 ORDER BY 在加入之前运行,因此失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
相关资源
最近更新 更多