Там, кажется, нет никакой собственности или метод, который непосредственно вычисляет количество результатов в IDataReader
. Этот интерфейс скорее намерен потребляться инкрементным/потоковым способом. Таким образом, чтобы подсчитать количество возвращаемых наборов результатов, увеличивайте счетчик каждый раз, когда вы вызываете IDataReader.NextResult()
, и он возвращает true
при потреблении данных.
Однако есть улов. документация для IDataReader.NextResult()
состояний:
По умолчанию считыватель данных устанавливается на первый результат.
Рассмотрим следующие сценарии:
- Команда возвращается 0 наборов результатов. Ваш первый звонок
IDataReader.NextResult()
возвращает false
.
- Команда вернула 1 результирующий набор. Ваш первый звонок
IDataReader.NextResult()
возвращает false
.
- Команда вернула 2 набора результатов. Ваш второй звонок
IDataReader.NextResult()
возвращает false
.
Вы можете видеть, что у нас достаточно информации для подсчета количества наборов результатов, пока существует хотя бы один результирующий набор. Это будет количество раз, которое IDataReader.NextResult()
возвращено true
плюс один.
Для определения наличия или отсутствия 0 наборов результатов мы используем другое свойство от читателя: IDataRecord.FieldCount
. В документации для этого свойства указано:
Если не установлено в действительном наборе записей, 0; в противном случае - количество столбцов в текущей записи. Значение по умолчанию - -1.
Таким образом, мы можем прочитать это поле при первом открытии считывателя, чтобы определить, находимся ли мы в допустимом наборе результатов или нет. Если команда не генерирует результирующих наборов, значение IDataRecord.FieldCount
на считывающем устройстве первоначально будет меньше 1. Если команда генерирует хотя бы один результирующий набор, значение первоначально будет положительным. Это предполагает, что для набора результатов невозможно иметь 0 столбцов (что, я думаю, можно предположить с помощью SQL, не уверен).
Итак, для подсчета количества наборов результатов я бы использовал следующее. Если вам также необходимо сохранить данные, что логика должна быть вставлена в это:
using (var reader = command.ExecuteReader())
{
var resultCount = 0;
do
{
if (reader.FieldCount > 0)
resultCount++;
while (reader.Read())
{
// Insert logic to actually consume data here…
// HandleRecordByResultIndex(resultCount - 1, (IDataRecord)reader);
}
} while (reader.NextResult());
}
Я проверил это с System.Data.SqlClient
и команды PRINT 'hi'
(0 результирующие наборы), SELECT 1 x WHERE 1=0
(1 набор результатов), и SELECT 1 x WHERE 1=0; SELECT 1 x WHERE 1=0
(2 набора результатов).
Что вы имеете в виду с подсчетом, количеством результирующих наборов или количеством подсчетов каждой строки? –
Процитировать результат результата от всех избранных, как он сказал. – butterbox
Я имею в виду подсчет результатов (над деревом). каждый набор может содержать несколько строк. – isxaker