Соединение SqlDataReader - PullRequest
       13

Соединение SqlDataReader

0 голосов
/ 31 декабря 2018

В моей службе Windows я выполняю хранимую процедуру, которая выбирает 2500 верхних строк из таблицы и возвращает данные службе.Я ловлю результаты, используя объект SqlDataReader.

Мой вопрос: возвращает ли объект SqlDataReader 2500 строк в мою службу и сохраняет их в памяти за один раз и читает каждую запись одну за другой или читает каждую запись одну за другой из сохраненногопроцедура в SQL Server?

Спасибо!

SqlCommand getData = new SqlCommand(adminConnectionString, adminConnection);

// Sets SqlCommand Information
getData.CommandText = adminDatabaseName + ".dbo.SprocToExecute";
getData.CommandType = CommandType.StoredProcedure;
getData.CommandTimeout = 300;

// Creates parameters, sets their values, and adds them to the SqlCommand
SqlParameter sessionIDParameter = new SqlParameter("@SessionID", SqlDbType.Int);
sessionIDParameter.Value = ID;
getData.Parameters.Add(sessionIDParameter);

SqlDataReader dataReader = getData.ExecuteReader();

if (dataReader.HasRows)
{
    while (dataReader.Read())
    {
        // DO SOMETHING WITH RECORD 
    }
}

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Объект SqlDataReader будет хранить только одну строку за раз в памяти.При вызове метода ExecuteReader() объекта SqlCommand создается небуферизованный поток данных для последовательной обработки входящей записи.Однако, если вы хотите, чтобы все строки считывались в память одновременно, это можно сделать с помощью объекта SqlDataAdapter.Это загрузит все записи, удовлетворяющие запросу, в память после вызова метода Fill.Обратите внимание: всегда вызывайте метод Close() объекта SqlDataReader, как только вы закончите его использовать.Не закрытие этого может иметь последствия, например, если используются выходные параметры, к ним нельзя получить доступ, пока не будет закрыто SqlDataReader.Соединение (adminConnection в вашем коде), используемое объектом SqlDataReader, принадлежит исключительно этому считывателю, когда читатель открывается и последующие команды или другие объекты SqlDataReader не могут использовать это соединение, пока оно не закрыто SqlDataReaderпо методу Close().

0 голосов
/ 31 декабря 2018

Сохраненный процесс продолжает обслуживать строки до конца цикла while (dataReader.Read ()).

Используйте SqlDataAdapter, если вы хотите получить все строки одновременно

        DataTable dt = new DataTable();
        SqlDataAdapter adapter = new SqlDataAdapter(getData);
        adapter.Fill(dt);

Сохраненная процедура запускается и заканчивается после выполнения «adapter.Fill (dt)»

...