Ответы:
С другой стороны, это:
По цене:
На самом деле это зависит от того, что вы делаете, но я предпочитаю DataReader, пока мне не понадобится что-то, что поддерживается только набором данных. SqlDataReader идеально подходит для общего случая доступа к данным при привязке к сетке только для чтения.
Для получения дополнительной информации см. Официальную документацию Microsoft .
while (reader.Read())цикла.
Ответ на это может быть довольно широким.
По сути, для меня главное отличие, которое обычно влияет на мои решения о том, какой использовать, состоит в том, что с помощью 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 обычно используется для заполнения DataSet или DataTable, поэтому у вас будет доступ к данным после закрытия вашего соединения (отключенный доступ).
SqlDataReader - это подключенный курсор только для быстрой перемотки вперед, который обычно работает быстрее, чем заполнение DataSet / DataTable.
Более того, с помощью SqlDataReader вы обрабатываете данные по одной записи за раз и не храните никаких данных в памяти. Очевидно, что с DataTable или DataSet у вас есть накладные расходы на выделение памяти.
Если вам не нужно хранить данные в памяти, поэтому для рендеринга используйте только SqlDataReader. Если вы хотите работать с данными в отключенном режиме, выберите DataAdapter, чтобы заполнить DataSet или DataTable.
Используйте SqlDataAdapter, если вы хотите заполнить DataSet / DataTable в памяти из базы данных. Затем у вас есть возможность закрыть / удалить соединение, передать данные / установить в памяти. Затем вы можете манипулировать данными и сохранять их обратно в БД с помощью адаптера данных в сочетании с InsertCommand / UpdateCommand.
Используйте SqlDataReader, если вам нужен быстрый доступ к данным с малым объемом памяти без необходимости гибкости, например, для передачи данных по вашей бизнес-логике. Это более оптимально для быстрого извлечения больших объемов данных с низким использованием памяти, поскольку он не загружает все данные в память за один раз - с подходом SqlDataAdapter DataSet / DataTable будет заполнен всеми данными, поэтому, если там много строк и столбцов, для хранения которых потребуется много памяти.
Функция Fill внутренне использует DataReader. Если ваше соображение - «Какой из них более эффективен?», То использование DataReader в замкнутом цикле, заполняющем коллекцию запись за записью, вероятно, будет такой же нагрузкой на систему, как и использование DataAdapter.Fill.
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)