Мой вопрос в том, как получить количество строк, возвращаемых запросом, используя SqlDataReader
C #. Я видел несколько ответов по этому поводу, но ни один из них не был четко определен, за исключением одного, в котором говорится, что нужно выполнить цикл while с Read()
методом и увеличить счетчик.
Моя проблема в том, что я пытаюсь заполнить многомерный массив с первой строкой, являющейся именами заголовков столбцов, а каждая строка после этого - данными строки.
Я знаю, что могу просто сбрасывать данные в элемент управления List и не беспокоиться об этом, но для моего личного назидания, и я также хотел бы извлекать данные из массива по своему усмотрению и отображать их в разных форматах.
Поэтому я думаю, что не могу использовать Read()
способ, а затем увеличить ++, потому что это означает, что мне придется открывать, Read()
а затем открывать Read()
снова, чтобы получить количество строк, а затем данные столбца.
Просто небольшой пример того, о чем я говорю:
int counter = 0;
while (sqlRead.Read())
{
//get rows
counter++
}
а затем цикл for для запуска по столбцам и выталкивания
something.Read();
int dbFields = sqlRead.FieldCount;
for (int i = 0; i < dbFields; i++)
{
// do stuff to array
}
источник
RepeatableRead
Уровень изоляции не выполняет диапазон блокировки , так что все еще позволяет запись должна быть вставлена, необходимо использовать уровень изоляцииSnapshot
илиSerializable
.Если вам не нужно извлекать всю строку и вы не хотите делать двойной запрос, вы, вероятно, можете попробовать что-то вроде этого:
Возможно, вам придется добавить транзакцию, если вы не уверены, что повторное использование той же команды автоматически добавит в нее транзакцию ...
источник
sqlCon.Close();
? Я думал, что этоusing
должно сделать это за тебя.Как указано выше, набор данных или типизированный набор данных может быть хорошей временной структурой, которую вы можете использовать для фильтрации. SqlDataReader предназначен для очень быстрого чтения данных. Пока вы находитесь в цикле while (), вы все еще подключены к БД и ждете, пока вы сделаете то, что вы делаете, чтобы прочитать / обработать следующий результат, прежде чем он перейдет. В этом случае вы можете получить лучшую производительность, если вы получите все данные, закроете соединение с БД и обработаете результаты в автономном режиме.
Люди, похоже, ненавидят наборы данных, поэтому все вышесказанное можно сделать и с набором строго типизированных объектов.
источник
Вы не можете получить количество строк непосредственно из считывателя данных, потому что это так называемый курсор с пожарным шлангом, что означает, что данные считываются построчно в зависимости от выполняемого чтения. Я бы не советовал делать 2 чтения данных, потому что существует вероятность того, что данные изменились между выполнением 2 чтений, и, таким образом, вы получите разные результаты.
Что вы можете сделать, так это прочитать данные во временную структуру и использовать ее вместо второго чтения. В качестве альтернативы вам нужно будет изменить механизм, с помощью которого вы получаете данные, и вместо этого используйте что-то вроде DataTable.
источник
для завершения ответа Pit и для лучшей производительности: получите все в одном запросе и используйте метод NextResult.
источник
Я также сталкиваюсь с ситуацией, когда мне нужно было вернуть лучший результат, но я также хотел получить общее количество строк, которые соответствуют запросу. Я наконец добираюсь до этого решения:
источник