Ce este mai bine: DataSet sau DataReader? (Programare, C#, Asp.Net, Ado.Net)

Daniel a intrebat.

Tocmai am văzut acest subiect: Datatable vs Datasetdar nu mi-a rezolvat îndoiala… Să vă explic mai bine, făceam conexiunea cu baza de date și aveam nevoie să afișez rezultatele într-un GridView. (Am folosit RecordSet când am lucrat cu VB6 cu ceva timp în urmă și DataSet este destul de asemănător cu acesta, așa că a fost mult mai ușor să folosesc DataSet.)Apoi un tip mi-a spus că DataSet nu este cea mai bună metodă de a face …

Deci, ar trebui să „învăț” DataReader sau să continui să folosesc DataSet? DataTable ?Care sunt avantajele și dezavantajele?

6 răspunsuri
Marc Gravell

Aceasta este în esență: „ce este mai bun: o găleată sau un furtun?”.

A DataSet este găleata în acest caz; vă permite să transportați un set de date deconectate și să lucrați cu ele – dar veți suporta costurile de transport al găleții (deci cel mai bine este să o păstrați la o dimensiune cu care vă simțiți confortabil).

Un cititor de date este furtunul: acesta oferă acces unidirecțional/ o singură dată la datele care trec pe lângă dumneavoastră; nu trebuie să transportați toată apa disponibilă deodată, dar trebuie să fie conectată la robinet/bază de date.

Și în același mod în care puteți umple o găleată cu un furtun, puteți umple DataSet cu cititorul de date.

Ideea pe care încerc să o spun este că fac lucruri diferite…

Eu personal nu folosesc DataSet foarte des – dar unii oameni le adoră. Cu toate acestea, folosesc cititoarele de date pentru accesarea BLOB-urilor etc.

Comentarii

  • @Marc, Bună analogie. Atunci când nu lucrați cu BLOB-uri, ce fel de acces la date folosiți? –  > Por Ash.
  • @Ash – În general, LINQ-to-SQL, SqlBulkCopy sau IDataReader. foarte rar, DataTable. Cam de două ori (vreodată) de fapt. –  > Por Marc Gravell.
  • Și, mai nou, „dapper” 🙂 –  > Por Marc Gravell.
Ahmad Mageed

Depinde de nevoile dumneavoastră. Una dintre cele mai importante diferențe este că un DataReader va păstra o conexiune deschisă la baza de date până când terminați cu ea, în timp ce un DataSet va fi un obiect în memorie. Dacă legați un control la un DataReader, atunci acesta rămâne deschis. În plus, un DataReader este o abordare de tip forward only pentru citirea datelor care nu pot fi manipulate. Cu un DataSet vă puteți deplasa înainte și înapoi și puteți manipula datele după cum considerați necesar.

Câteva caracteristici suplimentare: DataSet-urile pot fi serializate și reprezentate în XML și, prin urmare, pot fi transmise cu ușurință către alte niveluri. DataReaders nu pot fi serializate.

Pe de altă parte, dacă aveți o cantitate mare de rânduri de citit din baza de date pe care le transmiteți unui proces pentru o regulă de afaceri, un DataReader poate fi mai util decât să încărcați un DataSet cu toate rândurile, ocupând memorie și putând afecta scalabilitatea.

Iată un link care este puțin mai vechi, dar încă util: Contrastul dintre ADO.NET DataReader și DataSet.

Comentarii

  • Linkul este rupt. Vă rugăm să îl reparați sau să îl eliminați. –  > Por Al Kepp.
John Saunders

Ca urmare a observației lui Marc: puteți utiliza un DataSet fără nicio bază de date.

Îl puteți completa dintr-un fișier XML sau pur și simplu dintr-un program. Umpleți-l cu rânduri dintr-o bază de date, apoi întoarceți-vă și scrieți-l într-o altă bază de date.

Un DataSet este o reprezentare în totalitate în memorie a unei scheme relaționale. Depinde de dumneavoastră dacă îl veți utiliza sau nu cu o bază de date relațională reală.

Comentarii

  • Doar pentru înregistrare, acest lucru este valabil și pentru cititoarele de date – a se vedea „CsvReader”, „DataTableReader” etc. Iar pentru a o introduce înapoi într-o bază de date, SqlBulkCopy (ca exemplu) va funcționa fie cu DataTable, fie cu IDataReader. –  > Por Marc Gravell.
AviD

Nevoi diferite, soluții diferite.

După cum ați spus, dataset este cel mai asemănător cu VB6 Recordset. Adică, extragi datele de care ai nevoie, le pasezi, faci cu ele ce vrei. Oh, și apoi, în cele din urmă, scapă de ele când ai terminat.

Datareader este mai limitat, dar oferă o performanță MULT mai bună atunci când tot ce aveți nevoie este să citiți o singură dată datele. De exemplu, dacă completați singur o grilă – adică extrageți datele, le parcurgeți, pentru fiecare rând populați grila, apoi aruncați datele – datareader este mult mai bun decât dataset. Pe de altă parte, nici măcar nu încercați să folosiți datareader dacă aveți intenția de a actualiza datele…

Așadar, da, învățați-l – dar folosiți-l numai atunci când este cazul. Dataset vă oferă mult mai multă flexibilitate.

Comentarii

  • Mulțumesc AviD și Ahmad Mageed pentru răspunsurile rapide… Mă vor face să mă gândesc (și să învăț) multe despre asta! 🙂 –  > Por Daniel.
siddu patil

DataReader vs Dataset

1) – DataReader este proiectat în arhitectura orientată spre conexiune
– DataSet este proiectat în arhitectura deconectată

2) – DataReader oferă acces numai în avans la date
– DataSet oferă o navigare derulabilă la date

3) – DataReader este de tip read-only (numai pentru citire), nu putem face modificări la datele prezente sub el.
– DataSet este actualizabil, putem face modificări la datele prezente în el și trimite aceste modificări înapoi la sursa de date.

4) – DataReader nu oferă opțiuni precum căutarea și sortarea datelor.
– DataSet oferă opțiuni precum căutarea și sortarea datelor.

Martin Clarke

Pentru a răspunde la a doua întrebare – Da, ar trebui să învățați despre DataReaders. În orice caz, pentru a înțelege cum să le folosiți.

Cred că, în această situație, este mai bine să folosiți DataSets – din moment ce faceți data binding și toate celelalte (mă gândesc la cicluri CPU vs. efort uman).

Cât despre care dintre ele va oferi o performanță mai bună. Depinde foarte mult de situația dumneavoastră. De exemplu, dacă editați datele pe care le legați și dacă faceți modificări pe loturi, atunci vă va fi mai bine să folosiți DataSets.