我有一个存储过程,其中包含用于返回记录的ORDER BY
子句。
当我在SQL中执行时,我看到了合适的顺序。
但是,当我从客户端执行并加载到SqlDataReader
时,订单已更改。这不是预期的结果。我得到了相同的记录,但订单(或者它订购的列)已经改变了。
有什么可以操纵这个?或者,我可以做些什么才能在客户端的Reader上应用ORDER BY
?
SP的最终SELECT是:
SELECT DISTINCT
TotalMatchCount
,ExampleDescription as Description
,ExampleMatchCount
,ExampleLevenshtein
,Code6 as Code
,Tier1Code
,Tier1Description
,Tier1MatchCount
,Tier1Levenshtein
,Tier2Code
,Tier2Description
,Tier2MatchCount
,Tier2Levenshtein
,Tier3Code
,Tier3Description
,Tier3MatchCount
,Tier3Levenshtein
FROM
@SearchResults
Order by
ExampleMatchCount Desc
,ExampleLevenshtein ASC
,Tier3MatchCount DESC
,Tier3Levenshtein ASC
,Tier2MatchCount DESC
,Tier2Levenshtein ASC
,Tier1MatchCount DESC
,Tier1Levenshtein ASC
结果可能是(仅给出主要描述字段):
getting hh child ready for school
helping hh child with a school project
waiting for school bus with hh child
etc.
在客户端呼叫SP:
Private SearchRDR As System.Data.SqlClient.SqlDataReader
Dim db As DBAccess = New DBAccess
Dim rdr As System.Data.SqlClient.SqlDataReader
Try
db.AddParameter("@pSearchText", _SearchText)
rdr = db.ExecuteReader("sprc_SEL_Search")
If rdr.HasRows Then
'Get the data into the reader object
SearchRDR = rdr
此时我已检查rdr
中的值,但它们已经无序。但是在我的代码中,当我去加载数据网格视图时,我从其类中提取rdr
并加载值:
Dim rdr As System.Data.SqlClient.SqlDataReader
rdr = cSearch.SearchRDR
Try
If rdr.HasRows Then
While rdr.Read()
dgvSearch.Rows.Add(rdr("mycolumn").ToString()
. . . . . . . .
但如上所述,在它到达之前它已经失灵了。我看到的结果类似于:
waiting for school bus with nonhh child
dropping off nonhh child at friend's house
waiting for school bus with hh child
这不是上面显示的顺序。实际上,SQL中的第一项显示在阅读器的大约位置4(第4行)。然后第二行SQL项目出现在第6行。
最终,客户的订单没有变化。它只是没有使用服务器上指定的顺序。
答案 0 :(得分:0)
ADO DB对象具有内置的RowFilter和Sort属性,可以在将对象分配给数组之前将其直接应用于SQLDataReader对象。因此,即使SQL存储过程没有按预期顺序返回行,也可以在获取从ADO DB对象返回的记录集后获得正确的顺序。
rdr.Sort = "ExampleMatchCount Desc"