SqlDataAdapter против объекта sqldatareader



в чем разница между использованием SqlDataAdapter и SqlDataReader для получения данных из БД?



Я специально изучаю их плюсы и минусы, а также их скорость и производительность памяти.



спасибо

574   4  

4 ответов:

SqlDataReader:

  • держит соединение открытым, пока вы не закончите (не забудьте закрыть его!).
  • обычно можно повторить только один раз
  • - Это не так полезно для обновления в базе данных

С другой стороны, это:

  • только одна запись в памяти одновременно, а не весь результирующий набор (это может быть огромным)
  • примерно так же быстро, как вы можете получить за это итерация
  • позволяет начать обработку результатов раньше (как только первая запись доступна)

SqlDataAdapter / DataSet

  • позволяет закрыть соединение, как только он сделал загрузку данных, и даже может закрыть его для вас автоматически
  • все результаты доступны в
  • вы можете перебирать его столько раз, сколько вам нужно, или даже искать конкретную запись по индексу
  • имеет некоторые встроенные факультеты для обновления обратно в базу данных

стоимостью:

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

так что на самом деле это зависит от того, что вы делаете, но я предпочитаю DataReader, пока мне не нужно что-то, что поддерживается только набором данных. SqlDataReader идеально подходит для общего случая доступа к данным привязки к сетке только для чтения.

ответ на это может быть довольно широким.

по существу, основное различие для меня, которое обычно влияет на мои решения о том, какие использовать, заключается в том, что с помощью SQLDataReader вы "транслируете" данные из базы данных. С помощью SQLDataAdapter вы извлекаете данные из базы данных в объект, который сам может быть запрошен далее, а также выполняете операции CRUD.

очевидно, что с потоком данных SQLDataReader намного быстрее, но вы можете только процесс по одной записи за раз. С помощью SQLDataAdapter у вас есть полная коллекция соответствующих строк для вашего запроса из базы данных для работы с/пройти через ваш код.

предупреждение: если вы используете SQLDataReader, всегда, всегда, всегда убедитесь, что вы пишете правильный код, чтобы закрыть соединение, так как вы держите соединение открытым с SQLDataReader. Не удалось сделать это, или правильная обработка ошибок, чтобы закрыть соединение в случае ошибки в обработка результатов инвалид ваше приложение с утечками соединения.

простите мой VB, но это минимальный объем кода, который вы должны иметь при использовании SqlDataReader:

Using cn As New SqlConnection("..."), _
      cmd As New SqlCommand("...", cn)

    cn.Open()
    Using rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
            ''# ...
        End While
    End Using
End Using     

эквивалент в C#:

using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
    cn.Open();
    using(var rdr = cmd.ExecuteReader())
    {
        while(rdr.Read())
        {
            //...
        }
    }
}

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

SqlDataReader-это быстрый вперед-только и подключенный курсор, который, как правило, быстрее, чем заполнение DataSet/DataTable.

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

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

используйте SqlDataAdapter, когда требуется заполнить набор данных в памяти / DataTable из базы данных. Затем у вас есть гибкость, чтобы закрыть/удалить соединение, передать datatable/set в памяти. Затем вы можете манипулировать данными и сохранять их обратно в БД с помощью адаптера данных в сочетании с InsertCommand/UpdateCommand.

используйте SqlDataReader, когда требуется быстрый доступ к данным с низким объемом памяти без необходимости гибкости, например, для передачи данные вокруг вашей бизнес-логики. Это более оптимально для быстрого извлечения больших объемов данных с низким использованием памяти, поскольку он не загружает все данные в память за один раз-при подходе SqlDataAdapter DataSet/DataTable будет заполнен всеми данными, поэтому, если есть много строк и столбцов, для хранения потребуется много памяти.

Comments

    Ничего не найдено.