【发布时间】: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