Datatable против набора данных

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

Тем не менее, многие примеры в Интернете показывают, что вместо этого используется DataSet и осуществляется доступ к таблицам с помощью метода коллекций.

Есть ли какое-либо преимущество, с точки зрения производительности или иного, от использования DataSets или DataTables в качестве метода хранения результатов SQL?

Ответов (7)

Решение

Это действительно зависит от типа данных, которые вы возвращаете. Поскольку DataSet (по сути) является просто коллекцией объектов DataTable, вы можете возвращать несколько различных наборов данных в один и, следовательно, более управляемый объект.

С точки зрения производительности у вас больше шансов получить неэффективность из-за неоптимизированных запросов, чем из-за «неправильного» выбора конструкции .NET. По крайней мере, таков мой опыт.

Когда вы все равно имеете дело только с одной таблицей, самое большое практическое различие, которое я обнаружил, заключается в том, что DataSet имеет метод HasChanges, а DataTable - нет. Однако у обоих есть «GetChanges», так что вы можете использовать его и проверить значение null.

Объект DataTable представляет табличные данные в виде табличного кэша строк, столбцов и ограничений в памяти. DataSet состоит из набора объектов DataTable, которые можно связать друг с другом с помощью объектов DataRelation.

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

в 1.x раньше были вещи, которые DataTables не могли делать, а DataSets могли (не помню, что именно). Все это было изменено в 2.x. Я предполагаю, что именно поэтому во многих примерах до сих пор используются DataSets. DataTables должны быть быстрее, поскольку они более легкие. Если вы выбираете только один набор результатов, это лучший выбор между ними.

Есть некоторые оптимизации, которые вы можете использовать при заполнении DataTable, например, вызов BeginLoadData (), вставку данных, а затем вызов EndLoadData (). Это отключает некоторые внутренние действия в DataTable, такие как обслуживание индекса и т. Д. Подробнее см. В этой статье .

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

Если вы возвращаете только один набор результатов, я бы подумал, что DataTable будет более оптимизирован. Я бы подумал, что должны быть некоторые накладные расходы (небольшие), чтобы предлагать функциональность, которую выполняет DataSet, и отслеживать несколько DataTables.