SQLDataReader排序顺序与存储过程顺序

时间:2015-08-27 18:02:45

标签: sql sql-server vb.net ado.net sqldatareader

我有一个存储过程,其中包含用于返回记录的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行。

最终,客户的订单没有变化。它只是没有使用服务器上指定的顺序。

1 个答案:

答案 0 :(得分:0)

ADO DB对象具有内置的RowFilter和Sort属性,可以在将对象分配给数组之前将其直接应用于SQLDataReader对象。因此,即使SQL存储过程没有按预期顺序返回行,也可以在获取从ADO DB对象返回的记录集后获得正确的顺序。

rdr.Sort = "ExampleMatchCount Desc"