2015-08-27 3 views
3

У меня есть хранимая процедура, которая содержит условие ORDER BY для возврата моих записей. Когда я выполняю в SQL, я вижу соответствующий порядок.Порядок сортировки SQLDataReader в сравнении с порядком хранимой процедуры

Однако, когда я выполняю с клиента и загружаю его в SqlDataReader, заказ изменился. Это не ожидаемый результат. Я получаю те же записи, но порядок (или, может быть, столбцы, которые он заказывает) изменился.

Что можно было бы манипулировать этим? Или, что я могу сделать, чтобы применить ORDER BY на Reader у клиента?

Окончательный ВЫБРАТЬ из СП:

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:

На этом этапе я проверил значения в rdr, и они уже вышли из строя. Но в моем коде, когда я иду, чтобы загрузить GridView данных я тяну 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.

В конечном счете на клиенте нет изменений. Он просто не использует порядок, указанный на сервере.

+0

Укажите, пожалуйста, код, нужный результат и фактические результаты, которые вы получаете. –

+1

Предложение 'ORDER BY' в хранимой процедуре влияет на порядок, который они считывают с помощью' SqlDataReader'. Если это не работает, это было бы неожиданным поведением, и было бы невозможно диагностировать без рабочего примера кода, который дублирует поведение. –

+0

Считыватель не изменяет порядок записей. Что вы подразумеваете под «окончательным выбором»? Сохраненная процедура может иметь множество выборок, и все они будут переданы читателю. Вы можете получить к ним доступ через 'reader.NextResult'. Таким образом, может быть, вы получаете доступ к неправильному результату, если у вас есть несколько 'selects'? –

ответ

0

Объекты ADO DB имеют встроенные свойства RowFilter и Sort, которые могут быть применены непосредственно к объекту SQLDataReader до назначения объекта массиву. Таким образом, даже если хранимая процедура SQL не возвращает строки в ожидаемом порядке, вы можете добиться правильного порядка после получения набора записей, возвращаемого из объекта ADO DB.

rdr.Sort = "ExampleMatchCount Desc" 
Смежные вопросы