Până acum, toate exemplele discutate au folosit instrumentele ADO.NET bazate pe conexiuni. Atunci când această abordare este aplicată, datele exclud orice operațiuni cu ele în depozit în momentul în care sunt recuperate. Codul dvs. urmărește complet toate acțiunile utilizatorului, stocând informații și determinând când trebuie generată și executată o nouă comandă.
Firește, această soluție nu este lipsită de deficiențe, cum ar fi consecințele paralelismului. În funcție de modul în care este proiectată aplicația, un pachet comun de modificări poate fi trimis imediat. Dar singura eroare (cum ar fi încercarea de a actualiza o intrare pe care un alt utilizator o actualizează în același timp) poate distruge întregul proces de actualizare. Cu o codificare bine concepută, vă puteți proteja aplicația de aceste probleme, dar vor fi necesare eforturi suplimentare.
Pe de altă parte, uneori este posibil să folosiți modelul de acces ADO.NET și DataSet deconectat. Următoarele sunt scenariile în care DataSet este mai ușor de folosit decât DataReader:
Când aveți nevoie de un pachet convenabil pentru a trimite date unei alte componente (de exemplu, dacă partajați informații cu alte componente sau le livrați clienților printr-un serviciu web).
Când aveți nevoie de un format de fișier convenabil pentru serializarea datelor pe disc (obiectul DataSet include funcționalități încorporate care vă permit să le salvați într-un fișier XML).
Când trebuie să organizați navigarea în două direcții pentru o cantitate mare de date. De exemplu, puteți utiliza setul de date pentru a suporta un control de listă bazat pe listă care afișează informații în părți. În schimb, cititorul de date oferă o mișcare într-o singură direcție - înainte.
Când trebuie să navigați prin mai multe mese diferite. Un obiect DataSet poate stoca toate aceste tabele și informații despre relațiile dintre ele, permițându-vă să creați pagini "master-detaliate" fără a fi nevoie să interogați baza de date de mai multe ori.
Când trebuie să utilizați legarea datelor pentru a controla elementele interfeței utilizator. De asemenea, puteți utiliza DataReader pentru a lega datele, dar deoarece DataReader folosește numai un cursor unidirecțional, nu puteți lega date în mai multe controale. În plus, spre deosebire de DataSet, nu are capacitatea de a aplica criterii personalizate de sortare și filtrare.
Atunci când datele trebuie manipulate ca marcare XML.
Când doriți să oferiți actualizări batch. De exemplu, puteți crea un serviciu Web care permite clientului să încarce un tabel de date completat cu rânduri, să efectueze mai multe modificări în acesta și ulterior să îl trimită sursei de date. În acest moment, serviciul web poate efectua toate modificările unei singure operații (presupunând că nu sunt detectate conflicte).
Aplicații Web și DataSet
O concepție greșită este că obiectul DataSet este necesar pentru a asigura scalabilitatea aplicației Web. Acum, că înțelegeți arhitectura procesării interogărilor ASP.NET, probabil că veți vedea că acest lucru nu este adevărat. aplicații Web rulează în termen de câteva secunde, ceea ce înseamnă că, chiar dacă aplicația Web utilizează un acces direct pe baza cursorului, durata de viață a conexiunii este atât de scurtă încât nu poate afecta foarte mult scalabilitate, cu excepția Web foarte puternic încărcate aplicații.
De fapt, utilizarea DataSet este mult mai justificată în aplicațiile distribuite cu clienți multifuncționali Windows. În acest scenariu, clienții pot accesa setul de date de la server (probabil printr-un serviciu web) pentru a lucra cu aceste obiecte set de date pentru o lungă perioadă de timp, și re-conectați la sistem numai în cazul în care au nevoie să actualizeze sursa de date a modificărilor. Acest lucru permite sistemului să servească un număr mult mai mare de utilizatori concurenți decât atunci când fiecare client acceptă o conexiune directă, pe termen lung. De asemenea, vă permite să partajați eficient resursele prin cache-ul datelor pe server și să utilizați conexiunile de conexiuni între cererile clientului.
Obiectul DataSet acționează de asemenea ca un pachet de informații pur pentru aplicațiile client multifuncționale care se conectează periodic numai la sistem.
De exemplu, luați în considerare o agenție de turism care trebuie să introducă informații despre comenzi sau să vizualizeze informații despre vânzările de bilete pe un laptop. Folosind DataSet, aplicația de pe laptop-ul utilizatorului poate stoca date offline și le poate serializa într-un fișier XML. Acest lucru va permite comerciantului să facă comenzi noi utilizând datele din memoria cache, chiar și atunci când nu este disponibilă o conexiune la Internet. Noile date pot fi trimise mai târziu, când utilizatorul se poate conecta la sistem.
Deci, ceea ce rămâne pentru aplicațiile Web ASP.NET? De fapt, există două opțiuni. Puteți utiliza un obiect DataSet sau puteți utiliza comenzi directe care exclude necesitatea unui set de date. În general, când trebuie să adăugați, să inserați sau să actualizați înregistrările, puteți să o faceți fără DataSet. Cu toate acestea, nu va fi posibil să evitați complet utilizarea DataSet.
Atunci când extrageți înregistrări, cel mai probabil doriți să utilizați DataSet, deoarece el susține un set de mijloace absolut necesare. În special, DataSet facilitează transferul unui bloc de date dintr-o componentă de bază de date pe o pagină Web. Obiectul DataSet sprijină de asemenea legarea datelor, ceea ce face posibilă afișarea informațiilor în elemente de control multifuncționale, cum ar fi GridView. Din acest motiv, majoritatea aplicațiilor web recuperează date în DataSet, iar actualizările sunt produse prin comenzi directe.
Serviciile Web sunt singurul scenariu realist pentru utilizarea aplicațiilor web, în care se poate lua o decizie pentru a efectua o actualizare batch prin intermediul DataSet. În acest caz, aplicația client bogată încarcă date în DataSet, le editează și mai târziu trimite setul de date pentru a angaja modificările.
Integrarea cu XML
Obiectul DataSet reprezintă, de asemenea, serializarea încorporată în XML. Nici măcar nu trebuie să știe despre a profita de beneficiile sale, cum ar fi posibilitatea unui simplu set de date serilizatsii într-un fișier sau transferul de DataSet la o altă aplicație prin intermediul unui serviciu Web. Mai presus de toate, acest instrument vă permite să partajați date cu clienții scrise în alte limbi de programare care rulează pe alte sisteme de operare. Cu toate acestea, punerea în aplicare a unui astfel de soluție nu este simplă (și de multe ori DataSet - nu cea mai bună abordare), deoarece nu există decât o capacitate minimă de a personaliza structura XML de marcare care produce un set de date.
Obiectul DataSet este baza pentru accesul offline la date. DataSet conține două ingrediente esențiale: o colecție de zero sau mai multe tabele (disponibile prin intermediul tabelelor de proprietate), precum și o colecție de zero sau mai multe relații care pot fi utilizate pentru a lega tabelele între ele (reprezentat de relațiile de proprietate).
Figura de mai jos prezintă structura de bază a setului de date:
Uneori, dezvoltatorii-începători în ADO.NET fac o eroare, presupunând că DataSet trebuie să conțină toate informațiile dintr-o anumită tabelă sursă de date. Nu e așa. Din motive de performanță, DataSet este de obicei folosit pentru a lucra cu un subset mic de date sursă totală de informații. În plus, tabelele din DataSet nu trebuie să fie cartografiate direct în tabelele surselor de date. O singură tabelă poate conține rezultate de interogare pentru un singur tabel sau rezultatele unei interogări JOIN care combină datele din mai multe tabele conectate.
După cum puteți vedea în figură, fiecare intrare din colecția DataSet.Tables este un tabel de date. obiect DataTable conține o colecție proprie - colecție de obiecte Coloane DataColumn (care descrie numele și tipul fiecărui câmp de date) și o colecție de rânduri obiecte DataRow (conținând datele reale ale fiecărei intrări).
Fiecare intrare în DataTable este reprezentată de un obiect DataRow. Fiecare obiect DataRow reprezintă o singură înregistrare în tabelul care a fost extras din sursa de date. DataRow este containerul pentru valorile reale ale câmpurilor. Puteți să le accesați prin numele câmpului, ca în cazul myRow ["FieldName"]. Amintiți-vă întotdeauna că datele din sursă nu sunt deloc afectate atunci când lucrați cu obiecte DataSet. În schimb, toate modificările se fac local în obiectul DataSet localizat în memorie. DataSet nu se bazează niciodată pe nicio conexiune la sursa de date.
Unele metode ale clasei DataSet