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