Выберите набор строк и ОБНОВИТЕ или УДАЛИТЕ некоторые из них: SqlDataReader или SqlDataAdapter+DataSet.

Я новичок в ADO.net. Мне нужно получить из БД набор строк, затем повторить один за другим и отправить их, условно, некоторым объектам, которые могут UPDATE или DELETE получить строку из БД. Из документации SqlDataReader я не совсем понял, как это работает (Читает ли он из БД все строки или только некоторые из них или по очереди?) Из MSDN:

Результаты возвращаются по мере выполнения запроса и сохраняются в сетевом буфере на клиенте до тех пор, пока вы не запросите их с помощью метода Read объекта DataReader.

  • Когда именно возвращается результат? Во время command.ExecuteReader() или во время reader.Read()? И каково содержание Result - все данные или частичные?
  • Что такое «сетевой буфер» на локальной машине?
  • Откуда Read читает данные? Из БД или из кэша?

Повлияет ли модификация данных (UPDATE или DELETE) на получение из БД следующих данных? Заглушка кода:

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(queryString, connection))
{
    connection.Open();
    using (SqlDataReader reader = command.ExecuteReader());
    {
    while (reader.Read())
        {
            //ReadSingleRow...
        //Perform some checks and if TRUE send to a manager obeject whcih perform UPDATE or DELETE on this record
        }
    }
}

или лучше использовать SqlDataAdapter с DataSet или DataTable здесь?


person ALZ    schedule 17.04.2013    source источник
comment
Вы пробовали монитор активности из SSMS, когда вы выполняете код, вы увидите, какой SQL отправляется на сервер.   -  person Irfarino    schedule 17.04.2013
comment
пока нет, но сделаю. Но мой вопрос больше теоретический - я хочу понять, как это работает конкретно, потому что обходной путь всегда будет найден.   -  person ALZ    schedule 17.04.2013
comment
Пожалуйста, проигнорируйте предыдущий комментарий, время ожидания которого для меня истекло. Пробовали ли вы отлаживать свой код и использовать монитор активности в SSMS, чтобы увидеть, какой SQL выполняется и когда, попробуйте выполнить код, и вы точно увидите, что происходит. Чтобы ответить на ваш первый вопрос, метод command.executereader() отправит команду на сервер. Результаты сохраняются на клиентском ПК. Взгляните на эту ссылкуADO.NET. Взгляните на эту книгу, Базы данных Beginning C# 5.0 от APress, отличный ресурс по программированию ADO.NET.   -  person Irfarino    schedule 17.04.2013


Ответы (1)


Для того, что вы описываете, было бы лучше использовать SqlDataAdapter и DataTable - они разработаны как «автономный кеш» данных сервера, который будет отслеживать любые сделанные изменения и может обновлять копию сервера, когда SqlDataAdapter.Update() называется.

SqlDataReader спроектирован как поток данных с сервера, предназначенный только для чтения и только для пересылки — вам придется создать собственную логику для обновления сервера.

Чтобы ответить на другие ваши вопросы:

Когда именно возвращается результат?

Результаты возвращаются после завершения ExecuteReader(). В зависимости от того, как вы на это смотрите, это либо частичные, либо полные результаты — сервер полностью завершил выполнение запроса и отправляет все результаты клиенту, но клиент обрабатывает результаты только по одному пакету за раз.

Что такое «сетевой буфер» на локальной машине?

«Сетевой буфер», о котором говорит MSDN, относится к массиву байтов размером 8 КБ (или любой другой размер, заданный ключевым словом строки подключения «Размер пакета»), в котором хранится последний сетевой пакет, считанный с сервера. Это стандартная практика для приложений, работающих с сетевыми данными: вы копируете часть данных из сети в локальный буфер, анализируете эти данные и затем получаете следующую часть.

Откуда Read читает данные? Из БД или из кэша?

Read() обрабатывает данные из сетевого буфера до тех пор, пока в буфере не останется данных, затем он считывает следующий пакет из сети в буфер и продолжает его обработку.

person Daniel Paoliello    schedule 08.05.2013