Как получить количество использования строк SqlDataReader в C#

Я не думаю, что C# поддерживает семантику Диапазона. Вы могли записать дополнительный метод хотя, как:

public static IEnumerator<Byte> Range(this byte[] array, int start, int end);

, Но как другие сказали, не должны ли Вы устанавливать индекс запуска тогда Take, все, в чем Вы нуждаетесь.

93
задан Andrew Medico 23 September 2014 в 14:57
поделиться

3 ответа

Есть только два варианта:

  • Узнать, прочитав все строки (а затем вы можете их сохранить)

  • предварительно запустите специализированный запрос SELECT COUNT (*).

Двойное прохождение цикла DataReader действительно дорого, вам придется повторно выполнить запрос.

И (благодаря Питу Оханлону) второй вариант безопасен только для параллелизма, когда вы используете транзакцию с уровнем изоляции Snapshot. .

Поскольку вы все равно хотите сохранить все строки в памяти, единственный разумный вариант - прочитать все строки в гибком хранилище ( List <> или DataTable ), а затем скопировать данные в любом формате, который вы хотите. Операция в памяти всегда будет намного эффективнее.

92
ответ дан 24 November 2019 в 06:20
поделиться

Как указано выше, набор данных или типизированный набор данных может быть хорошей временной структурой, которую вы можете использовать для фильтрации. SqlDataReader предназначен для очень быстрого чтения данных. Пока вы находитесь в цикле while (), вы все еще подключены к БД и ждете, пока вы сделаете то, что вы делаете, чтобы прочитать / обработать следующий результат, прежде чем он перейдет. В этом случае вы можете получить лучшую производительность, если вы получите все данные, закроете соединение с БД и обработаете результаты в автономном режиме.

Похоже, что люди ненавидят наборы данных, поэтому описанное выше можно сделать и с набором строго типизированных объектов.

6
ответ дан 24 November 2019 в 06:20
поделиться

Вы не можете получить количество строк непосредственно из считывателя данных, потому что это так называемый курсор с пожарным шлангом, что означает, что данные считываются построчно на основе чтение выполняется. Я бы не советовал делать 2 чтения данных, потому что существует вероятность того, что данные изменились между двумя чтениями, и, таким образом, вы получите разные результаты.

Что вы можете сделать, так это прочитать данные во временную структуру , и используйте это вместо второго чтения. В качестве альтернативы вам потребуется изменить механизм получения данных и использовать вместо него что-то вроде DataTable.

5
ответ дан 24 November 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: