Відповіді:
З іншого боку, це:
Ціною:
Тож насправді це залежить від того, що ви робите, але я, як правило, віддаю перевагу 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.)