При запросе, который возвращает несколько результатов, мы повторяем между ними, используя NextResult()
SqlDataReader
. Таким образом, мы последовательно получаем результаты.SqlDataReader получить конкретный ResultSet
Есть ли способ получить результат случайным/не последовательным способом. Например, прыгайте сначала к третьему результату, затем к первому e.t.c
Я ищу, есть ли что-то вроде rdr.GetResult(1)
или обходной путь.
Так как я спросил Почему я хочу что-то вроде этого,
- Прежде всего у меня нет доступа к запросу и поэтому я не могу изменения, так что в моем клиенте я будет иметь результаты в последовательность, которую сервер пишет/производит.
- Для обработки (создания коллекций, сущностей -> бизнес-логики) первой мне нужна информация как второй, так и третьей.
- Опять же, поскольку это не вариант изменения кода, я не могу каким-либо образом (без написания большого количества кода) «хранить» информацию о соединении (например, идентификаторы), чтобы подключиться на более позднем этапе двумя ResultSets
- Самое «элегантное» решение (конечно, не единственное) состоит в том, чтобы обрабатывать результирующие наборы некорректно. Поэтому я спрашиваю, есть ли такой способ.
Update 13/6
Хотя Jeroen Mostert answer дает вдумчивое объяснение на почему, Think2ceCode1ce answer показывает правильные направления обхода. Содержание link в комментариях, как в дополнительных dataset
может быть использовано для работы в async
способом. ИМХО, это был бы путь, если бы собирался написать общее решение. Однако в моем случае я основывал свое решение на характере моих данных и на их логике. Короче говоря, (1) я читаю данные по мере их последовательного использования, используя SqlDataReader
; (2) Я храню некоторые данные, которые мне нужны в словаре и коллекции, когда я читаю первый в строке, но второй в логическом ResultSet; (3) Когда я читаю третий в строке, но сначала в логическом ResultSet, я повторяюсь через коллекцию, которую я создал ранее, и на основе данных словаря я создаю свой окончательный результат.
Последний код кажется более эффективным и более ремонтопригодным, чем при использовании async DataAdapter
. Однако это очень конкретное решение, основанное на моих данных.
'SqlDataReader' является курсором только вперед –
Зачем вы хотите это сделать? Вы пытаетесь избежать выполнения одного из заявлений? –
Я неправильно понял ваш вопрос, поэтому удалил свой ответ. Но в качестве комментария я просто упомянул, что DataTable и DataSet - это объекты, которые вы используете для кэширования локальных копий запросов для произвольного доступа и/или модификации. –