【发布时间】:2015-11-22 06:07:26
【问题描述】:
我有一个存储过程,其中包含用于返回我的记录的ORDER BY 子句。
当我在 SQL 中执行时,我会看到适当的顺序。
但是,当我从客户端执行并加载到 SqlDataReader 时,顺序发生了变化。这不是预期的结果。我得到了相同的记录,但是顺序(或者可能是它排序的列)发生了变化。
是什么在操纵这个?或者,我该怎么做才能在客户端的阅读器上应用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 行。
最终,客户的订单不会发生变化。它只是没有使用服务器指定的顺序。
【问题讨论】:
-
请贴出代码、想要的结果和你得到的实际结果。
-
存储过程中的
ORDER BY子句会影响SqlDataReader读取它们的顺序。如果它不以这种方式工作,那将是一个意外行为,如果没有一个重复该行为的代码的工作示例,就无法诊断。 -
阅读器不会改变记录的顺序。 “最终选择”是什么意思?存储过程可以有很多选择,它们都将传递给阅读器。您可以通过
reader.NextResult访问它们。那么,如果您有多个selects,您可能会访问错误的结果吗? -
在您检查阅读器中的行顺序时,它们已经错了,但在您开始阅读结果之前......这是不可能的。这并不是说我怀疑你的顺序是错误的。这是不可能的,因为数据读取器没有要检查的行。 它只是一次从服务器读取行,直到没有更多要读取的行。它只对单个记录和一个迭代器进行建模。
-
在这种情况下,很多时候,当您测试应用程序与直接执行 SP 时,您可能只是连接到不同的数据库,或者在您的情况下 - 表。这种可能性我已经看过太多次了。
标签: sql sql-server vb.net ado.net sqldatareader