Подтвердить что ты не робот

Разница между SqlDataReader.Read и SqlDataReader.NextResult

В чем основное отличие этих двух методов? На веб-сайте msdn это объясняется, как показано ниже, но я этого не понимаю.

Read Улучшает SqlDataReader до следующей записи. (Overrides DbDataReader.Read().)

NextResult Адаптирует считыватель данных к следующему результат, при чтении результатов пакетных операторов Transact-SQL. (Переопределяет dbDataReader.NextResult().)

4b9b3361

Ответ 1

Если ваш оператор /proc возвращает несколько наборов результатов, например, если у вас есть два оператора select в одном объекте Command, вы получите два набора результатов.

  • NextResult используется для перемещения между наборами результатов.
  • Read используется для перемещения вперед в записях одного набора результатов.

Рассмотрим следующий пример:

Если у вас есть proc, основной корпус которого похож:

.... Proc start

SELECT Name,Address FROM Table1

SELECT ID,Department FROM Table2

-- Proc End

Выполнение вышеуказанного proc приведет к созданию двух наборов результатов. Один для Table1 или первый оператор select и другой для следующего оператора select.

По умолчанию первый набор результатов будет доступен для Read. Если вы хотите перейти ко второму набору результатов, вам понадобится NextResult.

Смотрите: Извлечение данных с помощью DataReader

Пример кода из той же link: Извлечение множества наборов результатов с помощью NextResult

static void RetrieveMultipleResults(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM dbo.Categories;" +
          "SELECT EmployeeID, LastName FROM dbo.Employees",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        while (reader.HasRows)
        {
            Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
                reader.GetName(1));

            while (reader.Read())
            {
                Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
            reader.NextResult();
        }
    }
}

Ответ 2

Не совсем ответ на этот вопрос, но если вы используете метод DataTable.Load для использования данных от читателя, а не Reader. Обратите внимание, что после завершения метода загрузки читатель теперь помещается в начале следующего поэтому вы не должны вызывать метод NextResult, иначе вы пропустите следующий набор результатов.

Простой цикл на Reader.HasRows вокруг вызова DataTable.Load - это все, что вам нужно для обработки потенциальных множественных результирующих наборов в этом сценарии.