Вопрос по c#, ado.net, asp.net – Что лучше: DataSet или DataReader?

50

Я только что видел эту тему:Datatable против Dataset но это не решило мои сомнения. Позвольте мне объяснить лучше, я связывался с базой данных и мне нужно было показать результаты в GridView. (Я использовал RecordSet, когда работал с VB6 некоторое время назад, и DataSet очень похож на него, поэтому было гораздо проще использовать DataSet.) Тогда парень сказал мне, что DataSet не лучший способ сделать это.

Итак, я должен «учиться» DataReader или продолжать использовать DataSet? Таблица данных ? Какие плюсы / минусы?

Ваш Ответ

5   ответов
193

Это по существу: «что лучше: ведро или шланг?»

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

Считыватель данных - это шланг: он обеспечивает односторонний / однократный доступ к данным, когда они пролетают мимо вас; Вы не должны нести всю доступную воду одновременно, но она должна быть подключена к крану / базе данных.

И так же, как вы можете заполнить ведро со шлангом, вы можете заполнитьDataSet со считывателем данных.

Я пытаюсь подчеркнуть, что они делают разные вещи ...

Я не пользуюсь личноDataSet очень часто - но некоторые люди любят их. Однако я использую устройства чтения данных для доступа к BLOB и т. Д.

Хорошая аналогия там.
И совсем недавно, "Dapper" :)
@Ash - обычно LINQ-to-SQL,SqlBulkCopy или жеIDataReader. very редко,DataTable, На самом деле, дважды (когда-либо).
@Marc, хорошая аналогия. Когда вы не работаете с BLOB, какой тип доступа к данным вы используете?
4

Разные потребности, разные решения.

Как вы сказали, набор данных наиболее похож на VB6 Recordset. То есть извлекайте нужные данные, передавайте их, делайте с ними все, что захотите. О, и затем в конечном итоге избавиться от этого, когда вы закончите.

Datareader более ограничен, но он дает НАМНОГО лучшую производительность, когда все, что вам нужно, это прочитать данные один раз. Например, если вы заполняете сетку самостоятельно - т. Е. Извлекаете данные, проходите через нее, для каждой строки заполняете сетку, а затем выбрасываете данные - средство чтения данных намного лучше, чем набор данных. С другой стороны, даже не пытайтесь использовать datareader, если у вас есть намерение обновить данные ...

Так что, да, изучите это - но используйте его только тогда, когда это необходимо. Набор данных дает вам гораздо больше гибкости.

Спасибо AviD и Ахмаду Магиду за быстрые ответы. Заставит меня много думать (и узнать) об этом! :) Daniel
71

Это зависит от ваших потребностей. Одним из наиболее важных отличий является то, что DataReader будет сохранять открытое соединение с вашей базой данных до тех пор, пока вы не покончили с этим, пока DataSet не станет объектом в памяти. Если вы свяжете элемент управления с DataReader, он все еще будет открыт. Кроме того, DataReader - это подход только для чтения данных, которыми нельзя манипулировать. С помощью DataSet вы можете перемещаться вперед и назад и манипулировать данными по своему усмотрению.

Некоторые дополнительные функции: DataSets могут быть сериализованы и представлены в XML и, следовательно, легко передаются на другие уровни. Считыватели данных не могут быть сериализованы.

С другой стороны, если у вас есть большое количество строк для чтения из базы данных, которые вы передаете в какой-то процесс для бизнес-правила, DataReader может иметь больше смысла, чем загружать DataSet со всеми строками, занимая память и, возможно, влияя масштабируемость.

Вот ссылка, которая немного устарела, но все еще полезна:В отличие от ADO.NET DataReader и DataSet.

Ссылка не работает. Пожалуйста, исправьте или удалите его.
12

Дальше кМарк & APOS; s точка: вы можете использовать DataSet без базы данных вообще.

Вы можете заполнить его из файла XML или просто из программы. Заполните его строками из одной базы данных, затем разверните и запишите в другую базу данных.

DataSet - это полностью реляционное представление реляционной схемы. Использовать ли вы его в реальной реляционной базе данных или нет, решать вам.

Просто отметим, что это верно и для устройств чтения данных - см. «CsvReader», «DataTableReader». и т. д. И для отправки его обратно в базу данных SqlBulkCopy (в качестве примера) будет работать либо с DataTable, либо с IDataReader.
0

Чтобы ответить на ваш второй вопрос - да, вы должны узнать о DataReaders. Если что, так ты понимаешь, как ими пользоваться.

Я думаю, что вам лучше в этой ситуации использовать DataSets - поскольку вы делаете привязку данных и все такое (я думаю, что циклы ЦП против усилий человека).

Что касается того, который даст лучшую производительность. Это очень сильно зависит от вашей ситуации. Например, если вы редактируете данные, которые вы связываете, и вносите изменения в пакет, тогда вам будет лучше с DataSets

Похожие вопросы