Datatable vs Dataset

129

J'utilise actuellement un DataTable pour obtenir des résultats à partir d'une base de données que je peux utiliser dans mon code.

Cependant, de nombreux exemples sur le Web montrent l'utilisation d'un DataSet à la place et l'accès à la ou aux tables via la méthode des collections.

Y a-t-il un avantage, en termes de performances ou non, à utiliser des DataSets ou des DataTables comme méthode de stockage des résultats SQL?

GateKiller
la source
1
Si vous travaillez avec des applications Web, vous pouvez envisager d'utiliser un DataReader: aspnet.4guysfromrolla.com/articles/050405-1.aspx aspnet.4guysfromrolla.com/articles/051805-1.aspx devx.com/vb2themax/ Article / 19887/1954? Pf = true
Chris Burgess
En fin de compte, DataTable et DataSet ont été des transitions utiles d'ADO RecordSet ... en 2002. Vous ne devriez pas en faire votre métaphore de données principale ces jours-ci.
Marc Gravell
@MarcGravell Que suggéreriez-vous comme métaphore des données primaires ces jours-ci?
m_a_s
@m_a_s t - classes explicites, typiquement; peut-être "enregistre" en c # vNext
Marc Gravell

Réponses:

94

Cela dépend vraiment du type de données que vous rapportez. Étant donné qu'un DataSet est (en fait) juste une collection d'objets DataTable, vous pouvez renvoyer plusieurs ensembles distincts de données dans un seul objet, et donc plus gérable.

En termes de performances, vous êtes plus susceptible d'obtenir une inefficacité de requêtes non optimisées que d'un "mauvais" choix de construction .NET. Du moins, c'est mon expérience.

ZombieMouton
la source
29

Une différence majeure est que les DataSets peuvent contenir plusieurs tables et vous pouvez définir des relations entre ces tables.

Si vous ne renvoyez qu'un seul ensemble de résultats, je pense qu'un DataTable serait plus optimisé. Je pense qu'il doit y avoir une surcharge (accordée petite) pour offrir les fonctionnalités d'un DataSet et garder une trace de plusieurs DataTables.

Joshua Hudson
la source
8

dans 1.x, il y avait des choses que DataTables ne pouvait pas faire que les DataSets pouvaient faire (je ne me souviens pas exactement de quoi). Tout cela a été changé dans 2.x. Je suppose que c'est pourquoi de nombreux exemples utilisent encore des DataSets. Les DataTables devraient être plus rapides car ils sont plus légers. Si vous ne tirez qu'un seul jeu de résultats, c'est votre meilleur choix entre les deux.

Karl Seguin
la source
4
AFAIK un gros problème était qu'un DataTable ne pouvait pas être sérialisé et ne pouvait pas être retourné à la suite d'un WebService.
Martin Clarke
6

Une caractéristique du DataSet est que si vous pouvez appeler plusieurs instructions de sélection dans vos procédures stockées, le DataSet aura un DataTable pour chacune.

Shawn
la source
Vous pouvez également exécuter plusieurs requêtes de sélection SQL dans une seule commande SQLCommand et accéder à chaque ensemble de résultats dans l'ensemble de données.Tables [i]
janvier
3

Il existe des optimisations que vous pouvez utiliser lors du remplissage d'un DataTable, comme l'appel de BeginLoadData (), l'insertion des données, puis l'appel de EndLoadData (). Cela désactive certains comportements internes dans le DataTable, tels que la maintenance des index, etc. Consultez cet article pour plus de détails.

tbreffni
la source
1

Quand vous ne traitez qu'une seule table de toute façon, la plus grande différence pratique que j'ai trouvée est que DataSet a une méthode "HasChanges" mais pas DataTable. Cependant, les deux ont un "GetChanges", vous pouvez donc l'utiliser et tester null.

MickeyfAgain_BeforeExitOfSO
la source
0

Un objet DataTable représente des données tabulaires sous la forme d'un cache tabulaire en mémoire de lignes, de colonnes et de contraintes. Le DataSet se compose d'une collection d'objets DataTable que vous pouvez associer les uns aux autres avec des objets DataRelation.

Nischal Tyagi
la source