SQLDataReader - 没有结果

时间:2012-05-22 19:42:43

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

请查看下面的架构:

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是否产生了错误?

UPDATE 请不要发布有关内存泄漏的答案,例如连接未关闭等或未处理异常的事实。我意识到这一点。我制作了上面的代码,试图重新创建问题。

UPDATE2 23/05/2012 19:30 gmt 我已经做了一些进一步的测试,并且它表明在使用参数化查询时会出现差异,即在执行命令对象后,行将在SQL Studio管理器中返回,但不会在应用程序中返回。我知道参数化查询是缓存的。参数化执行计划可能与无参数化执行计划有什么不同?

2 个答案:

答案 0 :(得分:2)

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

我建议你试试:

SELECT [insert order by projection here] FROM Person

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

答案 1 :(得分:1)

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