Datatable vs Dataset

129

Obecnie używam DataTable, aby uzyskać wyniki z bazy danych, których mogę użyć w moim kodzie.

Jednak wiele przykładów w sieci Web pokazuje, że zamiast tego używają DataSet i uzyskują dostęp do tabel za pomocą metody collections.

Czy jest jakaś korzyść, pod względem wydajności lub nie, z używania DataSets lub DataTables jako metody przechowywania wyników SQL?

GateKiller
źródło
1
Jeśli pracujesz z aplikacjami internetowymi, możesz rozważyć użycie DataReader: aspnet.4guysfromrolla.com/articles/050405-1.aspx aspnet.4guysfromrolla.com/articles/051805-1.aspx devx.com/vb2themax/ Artykuł / 19887/1954? Pf = true
Chris Burgess
Ostatecznie DataTable i DataSet były pożytecznymi przejściami z ADO RecordSet ... w 2002 roku. W dzisiejszych czasach nie należy upiec ich jako podstawowej metafory danych.
Marc Gravell
@MarcGravell Co w dzisiejszych czasach sugerowałbyś jako podstawową metaforę danych?
m_a_s
@m_a_s jawne t - klasy, zazwyczaj; być może „zapisy” w c # vNext
Marc Gravell

Odpowiedzi:

94

To naprawdę zależy od rodzaju danych, które przynosisz. Ponieważ DataSet jest (w efekcie) tylko zbiorem obiektów DataTable, można zwrócić wiele różnych zestawów danych do jednego, a zatem łatwiejszego w zarządzaniu obiektu.

Pod względem wydajności bardziej prawdopodobne jest, że niezoptymalizowane zapytania będą nieefektywne niż z powodu „złego” wyboru konstrukcji .NET. Przynajmniej takie było moje doświadczenie.

ZombieSheep
źródło
29

Jedną z głównych różnic jest to, że DataSets może zawierać wiele tabel i można definiować relacje między tymi tabelami.

Jeśli zwracasz tylko jeden zestaw wyników, myślę, że DataTable byłby bardziej zoptymalizowany. Wydaje mi się, że musi istnieć pewien narzut (przyznany niewielki), aby zaoferować funkcjonalność zestawu DataSet i śledzić wiele DataTables.

Joshua Hudson
źródło
8

w 1.x były rzeczy, których DataTables nie mógł zrobić, a których DataSets nie potrafił (nie pamiętam dokładnie co). Wszystko to zostało zmienione w wersji 2.x. Domyślam się, że dlatego wiele przykładów nadal używa DataSets. DataTables powinno działać szybciej, ponieważ są lżejsze. Jeśli wyciągasz tylko jeden zestaw wyników, to najlepszy wybór między nimi.

Karl Seguin
źródło
4
Okazuje się, że jednym wielkim problemem jest to, że DataTable nie może zostać serializowany i nie może zostać zwrócony w wyniku usługi WebService.
Martin Clarke,
6

Jedną z funkcji DataSet jest to, że jeśli możesz wywołać wiele instrukcji Select w procedurach składowanych, DataSet będzie miał jedną DataTable dla każdego.

Shawn
źródło
Możesz również uruchomić wiele zapytań SQL wybierających w jednej SQLCommand i uzyskać dostęp do każdego zestawu wyników w zestawie danych. Tabele [i]
styczeń
3

Istnieje kilka optymalizacji, których można użyć podczas wypełniania DataTable, takich jak wywołanie BeginLoadData (), wstawienie danych, a następnie wywołanie EndLoadData (). Spowoduje to wyłączenie niektórych zachowań wewnętrznych w DataTable, takich jak konserwacja indeksu itp. Więcej informacji można znaleźć w tym artykule .

tbreffni
źródło
1

Kiedy i tak masz do czynienia tylko z pojedynczą tabelą, największą praktyczną różnicą, jaką znalazłem, jest to, że DataSet ma metodę „HasChanges”, ale DataTable nie. Oba mają jednak „GetChanges”, więc możesz go użyć i przetestować pod kątem wartości null.

MickeyfAgain_BeforeExitOfSO
źródło
0

Obiekt DataTable reprezentuje dane tabelaryczne jako zapisaną w pamięci, tabelaryczną pamięć podręczną wierszy, kolumn i ograniczeń. DataSet składa się z kolekcji obiektów DataTable, które można powiązać ze sobą za pomocą obiektów DataRelation.

Nischal Tyagi
źródło