SqlDataAdapter vs SqlDataReader

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

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

благодаря

SqlDataReader:

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

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

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

SqlDataAdapter / DataSet

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

По цене:

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

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

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

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

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

ПРЕДУПРЕЖДЕНИЕ. Если вы используете SQLDataReader, ВСЕГДА, ВСЕГДА, ВСЕГДА убедитесь, что вы написали правильный код, чтобы закрыть соединение, поскольку вы поддерживаете соединение открытым с помощью SQLDataReader. Если это не так, или правильная обработка ошибок, чтобы закрыть соединение в случае ошибки при обработке результатов, CRIPPLE ваше приложение с утечками соединения.

Простите мой 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()) { //... } } } в using (var cn = new SqlConnection("...")) using (var cmd = new SqlCommand("...")) { cn.Open(); using(var rdr = cmd.ExecuteReader()) { while(rdr.Read()) { //... } } } 

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

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

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

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

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

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

  • «Недостижимая прямая база», вызванная множественным наследованием
  • Примеры C ++ SFINAE?
  • Как я могу проверить валидатор данных annotations, чтобы также проверить сложные дочерние свойства?
  • OpenCV лучше обнаруживает красный цвет?
  • Синтаксис инициализатора вложенных объектов
  • Передайте комплексные параметры
  • Каковы реальные накладные расходы на try / catch в C #?
  • Зачем использовать hex?
  • отправка блоков 2D-массива в C с использованием MPI
  • Как и когда использовать `async` и` await`
  • Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
  • Давайте будем гением компьютера.