Lucrul cu date offline în, ado

Kondratev Denis
visualdesign.ru

Tehnologia ADO.NET, spre deosebire de predecesorii săi, ADO și OLE DB, a fost dezvoltat special pentru utilizarea în aplicații web, în ​​cazul în care nu există conexiuni persistente la baza de date. munca tradițională cu date în ADO.NET se bazează pe următoarea schemă: o conexiune de conectare, atunci acesta este deschis de Open, a crea o comandă de comandă obiect incapsuleaza o comandă SQL, acesta este executat, iar conexiunea este apoi închisă. Această abordare oferă acces on-line la rezultatele interogării. Ie Prin citirea datelor utilizând DataReader, nu puteți sări peste mai multe înregistrări sau să reveniți la cea anterioară. Accesul în flux are o performanță maximă.
ADO.NET a fost dezvoltat pentru a accesa datele fără o conexiune reală cu baza de date. Toate datele sunt stocate în RAM. Lucrul cu datele deconectate din ADO.NET se face folosind clase din spațiul de nume System.Data.

Cea mai importantă clasă atunci când lucrați cu date detașate este DataSet. După ce rezultatele interogării sunt primite utilizând DataAdapter și stocate în DataSet 'e, conexiunea dintre baza de date și obiectul DataSet nu mai există. Modificările din setul de date nu afectează baza de date și viceversa. Clasa DataSet include un set de tabele DataTable și relații între tabelele DataRelation. clasa DataTable include un set de linii ale coloanei DataRow, DataColumn pune masa, și stabilește relații ChildRelations ParentRelations între coloane diferite tabele de baze de date. Clasa DataRow încapsulă informațiile din rând în tabel și starea liniei șterse, modificate, noi și neschimbate. Clasa Constrângere este utilizată pentru a păstra integritatea datelor din tabele.

Avantajele lucrului cu datele deconectate:
1. Nu aveți nevoie de o conexiune permanentă la baza de date, care este necesară, de exemplu, pentru aplicațiile web;
2. Este mai ușor să creați aplicații pe mai multe niveluri. Dacă aplicația accesează baza de date utilizând obiecte de nivel DAL, atunci obiectele de afaceri de la nivelul BLL pot transmite DataSet. Actualizările la baza de date pot fi, de asemenea, transferate utilizând DataSet;
3. facilitează sortarea, căutarea, filtrarea și navigarea prin date;
4. Lucrul cu datele relaționale este facilitat;
5. Este posibilă modificarea memoriei în cache. Obiectul DataSet permite modificarea cache-ului și apoi utilizarea DataAdapter-ului pentru a transfera toate modificările în baza de date într-un singur moment;
6. Integrare strânsă cu XML. Conținutul DataSet poate fi descărcat și salvat ca documente XML.

Utilizarea obiectelor DataSet

Următoarea este un exemplu de utilizare a unui obiect DataSet. Toate exemplele din articol folosesc baza de date Northwind a MS SQL Server.

stringconn = "Provider = SQLSQL; Sursa de date = (local) \\ NetSDK; InitialCatalog = Northwind; Trusted_Connection = Da;";
string query = "SELECT CustomerID, CompanyName, ContactName, Telefon FROM Clienți";
SqlDataAdapter da = nou SqlDataAdapter (interogare, conn);
DataSet ds = nou set de date ();
da.Fill (ds, "Clienți");

Mai întâi, creați un șir de conexiuni din baza de date și interogarea SQL pentru a prelua datele. DataAdapter pune rezultatele interogării în tabela de date corespunzătoare care se află în DataSet. Folosind metoda de încărcare supraîncărcată, puteți pune datele direct în tabelul de date. Pentru un tabel, puteți apela în mod repetat Fill metoda, cu toate acestea, dacă apelați metoda de umplere pentru setul de date fără a specifica în mod explicit numele tabelului, datele vor fi mutate în diferite tabele (de exemplu, „Tabelul“, „Tabelul 1“, „Tabelul2“). Pentru a accesa datele din tabel, există o proprietate Rows care returnează un set de obiecte DataRow

Tabelul TableTable = ds.Tables [0];
Rândul DateRow = tabel.Rânduri [0];
Console.WriteLine ("Număr de ordine:" + rând ["Cod de comandă"]);
Console.WriteLine ("Codul de client": + rând ["Codul client"]);

Obiectul DataRow are o proprietate element care returnează conținutul unui anumit câmp. Puteți specifica un nume de câmp ca în exemplul de cod sau un întreg corespunzător coloanei ordonale. Când căutați după index, datele sunt returnate un pic mai repede decât atunci când căutați după numele coloanei.

Schimbarea conținutului unui tabel de date

Pentru a adăuga un rând nou în tabel, există o metodă NewRow () care creează un nou obiect DataRow, dar nu adaugă o intrare în tabel. Câmpul înregistrării noi este setat la valorile implicite sau Null dacă valoarea implicită nu este specificată.

Rândul DateRow = ds.Tables ["Clienți"] NewRow ();
rând ["Codul de client"] = "VASYA";
rând ["Companie"] = "Companie";
rând ["ContactName"] = "Vasya Pupkin";
rând ["Telefon"] = "11-22-33";
ds.Tables ["Clienți"] Rows.Add (rând);

Există un alt mod de a adăuga înregistrări la masă - metoda LoadDataRow (). Primul parametru al acestei metode este o serie de valori ale căror elemente corespund coloanelor din tabel. Al doilea este de a controla valoarea proprietății RowState a noii înregistrări. Dacă treceți false, valoarea acestei proprietăți este Adăugată, la adăugarea unei noi intrări utilizând metoda Adăugare.

Puteți edita o intrare existentă după cum urmează:

Rândul DataRow = ds.Tables ["Clienți"] [0];
rând ["ContactName"] = "Vasya Pupkin";

sau folosind metoda ItemArray:

Pentru a șterge o intrare, trebuie să apelați metoda DataRow.Delete (). În acest caz, înregistrarea eliminată nu este efectiv șters din tabelul de date, dar este marcată ca ștearsă - proprietatea RowState ia valoarea Ștergere. Dacă, înainte de a apela metoda de ștergere, a fost adăugată valoarea RowState, în acest caz șirul este eliminat din tabel.

Utilizarea coloanelor cu autoincrement

Pentru a susține coloanele cu o creștere automată a valorii, DataColumn are proprietățile AutoIncrement, AutoIncrementSeed și AutoIncrementStep. Pentru a crea o coloană DataColumn cu auto-incrementare, trebuie să setați proprietatea AutoIncrement la true. Valoarea contorului va începe cu AutoIncrementSeed (dacă nu încalcă corectitudinea datelor din tabel) și crește cu valoarea AutoIncrementStep. Pentru coloanele cu autoincrement se recomandă setarea proprietății ReadOnly la true. Următoarea este un exemplu de introducere a unei coloane de incrementare automată într-un tabel

Coloana DateColumn = table.Columns.Add ("ID-ul clientului", typeof (Int32));
column.AutoIncrement = true;
column.AutoIncrementSeed = 1;
column.AutoIncrementStep = 1;

Dacă aveți de gând să demoleze modificările la baza de date de DataAdapter.Update (), este recomandat să setați proprietățile și valoarea AutoIncrementSeed AutoIncrementStep -1. Acest lucru asigură că ADO.NET va genera valori de etichete care nu sunt în baza de date. Când se solicită metoda de actualizare, se adaugă valori unice în baza de date.

Lucrul cu DataSet în Visual Studio .NET

Puteți crea obiecte DataSet fie programabil, fie utilizând mediul Visual Studio. Pentru cel de-al doilea caz, fila Date se află în bara de instrumente. În primul rând, trebuie să trageți obiectul SqlDataAdapter pe web sau pe formularul de câștig.

Lucrul cu date offline în, ado

Apoi, în expert, creați o nouă conexiune la baza de date specificând baza de date Northwind și modul de accesare a bazei de date sub numele de "Utilizați instrucțiuni SQL". După aceasta, selectați tabelul Clienți și selectați toate coloanele din tabel.

Lucrul cu date offline în, ado

Repetați procesul pentru tabelul de comandă, utilizând conexiunea gata. Apoi, faceți clic dreapta pe panoul cu datele de tip DataAdapter create, selectați Generate DataSet din meniul contextual.

Lucrul cu date offline în, ado

Bifați atât DataAdapter și faceți clic pe OK.

Lucrul cu date offline în, ado

Obiectul AddSetSet a fost afișat în panoul component. Am adăugat așa-numitul. DataSet cu control strict de tip (DataSet tastat), despre care vom vorbi mai târziu. Structura datelor poate fi vizualizată în fișierul creat cu extensia xsd.

Lucrul cu datele relaționale

Lucrul cu datele relaționale se realizează utilizând obiecte din clasa DataRelation, conectând coloanele DataColumn două tabele DataTable. Puteți crea un astfel de obiect în felul următor:

ds.Relationships.Add (nou DataRelation ( "CustomersOrders", ds.Tables [ "Clienții"] Coloanele [ "CustomerID"], ds.Tables [ "Comenzi"] Coloanele [ "CustomerID"]) ..;

Dacă doriți să definiți o relație bazată pe mai multe coloane, trebuie să utilizați un constructor care ia o serie de obiecte DataColumn:

Tabelul de date tblParent = ds.Tables ["ParentTable"];
Coloană de date [] colsParent = DataColumn nouă [];
Tabelul de date tblChild = ds.Tables ["ChildTable"];
Coloană de date [] colsChild = DataColumn nouă [];
ds.Relationships.Add (noua relație de date ("ParentChild", colsParent, colsChild));

Lucrul cu date corelate

Aplicația principală a obiectelor DataRelation este căutarea de date conexe. Cu toate acestea în sine DataRelation obiect nu oferă această funcționalitate, se realizează metode de clasă DataRow: GetChildRow (), GetParentRow () și GetParentRows ().
Pentru a căuta înregistrări copii, se folosește metoda GetChildRow () a obiectului DataRow corespunzător. Se trece la el numele obiectului DataRelation care definește relația. Această metodă returnează înregistrările copil ca o serie de obiecte DataRow.

Rândul DateRow = ds.Tables ["Clienți"] Rânduri [0];
foreach (DataRow rowOrder în rând.GetChildRows ("CustomersOrders"))
Console.WriteLine (rânduriOrder ["OrderID"] + rowOrder ["OrderDate"] + "\ n");

Pentru a găsi înregistrarea părinte folosind DataRelation, puteți folosi metoda DataRow.GetParentRow ().

DataRow rowOrder = ds.Tables ["Comenzi"] Rânduri [0];
Console.WriteLine ( "\ t" + rowOrder.GetParentRow ( "CustomersOrders") [ "ContactName"] + "\ n");

În cazul relației „una la mai multe“ pentru a găsi toate părinte înregistrează un anumit obiect DataRow poate fi GetParentRows metoda (), precum și numele de gazdă al relației, și returnează o matrice de obiecte-mamă.

Adăugarea unui obiect DataRelation la Visual Studio .NET

Pentru a adăuga relație DataRelation în setul de date tastat puternic aveți nevoie pentru a merge la structura de date, făcând clic pe fișierul cu extensia XSD, care determină structura setului de date. Faceți clic pe tabela de date părinte cu butonul drept și selectați Add / New Relation din meniul contextual.

Lucrul cu date offline în, ado

Caseta de dialog Editare relație specifică obiectele părinte și copil.

Lucrul cu date offline în, ado

Când faceți clic pe OK, XML Sheme Designer afișează o reprezentare grafică a DataRelation, o linie care leagă 2 obiecte.

Căutați înregistrări

Atunci când interogările către o bază de date sunt adesea necesare pentru a găsi înregistrarea prin cheia primară. Pentru a găsi înregistrări în DataTable, există metoda DataRowCollection.Find ().

table.PrimaryKey = noua DataColumn [];
Rândul DateRow = tbl.Rows.Find ("VASYA");
dacă (rând == null)
Console.WriteLine ("Intrarea nu a fost găsită");
altfel
Console.WriteLine (rândul ["CompanyName"]);

Dacă cheia primară constă din mai multe coloane, puteți transfera o serie de obiecte în metoda Find ().
Pentru a efectua o căutare pe o interogare SQL arbitrară, DataTable are o metodă Find (). De exemplu, pentru a obține numele tuturor cumpărătorilor care se află în Ufa, puteți utiliza acest cod

DataRow [] rânduri = table.Select ("City = 'Ufa'");
foreach (rândul DataRow în rânduri)
Console.WriteLine (rândul ["CompanyName"] + "\ n");

Dacă doriți ca datele returnate să fie sortate, puteți utiliza versiunea supraîncărcată a acestei metode. Simulează secțiunea ORDER BY BY a cererii.

DataRow [] rânduri = table.Select ("City = 'Ufa'", "CompanyName ASC");

Lucrul cu obiectele DataSet cu control strict de tip

Anterior, am creat deja obiecte DataSet cu control strict de tip. Să analizăm ce funcții noi au apărut în DataSet tastat.

Adăugarea unei înregistrări

Toate clasele care corespund tabelelor DataTable din DataSet vă permit să adăugați intrări noi în două moduri. Metoda nouă [Table_name] Row () returnează un rând nou în tabel:

DataSetTest ds = nou DataSetTest ();
DataSetTest.CustomersDataTable tblCustomers = ds.Customers;
DataSetTest.CustomersRad rowCustomer = tblCustomers.NewCustomersRow ();
rowCustomer.CustomerID = "VASYA";
rowCustomer.CompanyName = "Companie";
rowCustomer.ContactName = "Vasya Pupkin";
rowCustomer.Phone = "11-22-33";
tblCustomers.AddCustomersRow (rândCustomer);

A doua modalitate este de a folosi metoda Add [Table_name] Row (), care ia o serie de obiecte care corespund câmpurilor din înregistrare:

DataSetTest ds = nou DataSetTest ();
DataSetTest.CustomersDataTable.AddCustomersRow ( "Vasya", "Compania", "John Doe", "11-22-33");

Căutați o postare

De asemenea, sa căutat o înregistrare în tabel. De exemplu, pentru a căuta în tabelul Detalii de comandă pentru o cheie compusă, a fost introdusă următoarea metodă

DataSetTest.Order_DetailRow = tblDetails.FindByOrderIDProductID (112233, 456);

De asemenea, DataSet tastat acceptă scrisori ruse în numele tabelelor și câmpurilor din tabele.

ds.Statistics.Add StatisticsRow (15.9, "companie", adevărat);

Transfer de actualizări în baza de date

Pentru a transfera modificări în baza de date, utilizați obiectele DataAdapter. Pentru a crea logica actualizării bazei de date, puteți utiliza una din cele trei opțiuni:
1. configurați manual DataAdapter în timpul perioadei de dezvoltare;
2. folosiți obiectul CommandBulder la timpul de execuție;
3. Utilizați expertul de configurare DataAdapter în timpul perioadei de dezvoltare.

Configurarea manuală a adaptorului de date

DataAdapter are 3 proprietăți pentru transferarea modificărilor în baza de date: InsertCommand, UpdateCommand și DeleteCommand. Valorile acestor proprietăți trebuie să fie specificate înainte de a apela metoda DataAdapter.Update (), luând în considerare modificările efectuate în DataSet. Când metoda Update () adaugă, actualizează sau șterge rânduri într-un tabel, aceasta apelează comanda corespunzătoare.
Dacă în cursul acțiunilor dvs. ați adăugat doar rânduri la masă, atunci trebuie să specificați numai valoarea InsertCommand. Iată codul pentru această situație:

string conn = "Furnizor = SQLSQL; Sursa de date = (local) \\ NetSDK; Catalog inițial = Northwind; Trusted_Connection = Da;";
string query = "SELECT CustomerID, CompanyName, ContactName, Telefon FROM Clienți"; SqlDataAdapter da = nou SqlDataAdapter (interogare, conn); Tabelul DataSet = nou set de date (); da.Fill (tabel, "Clienți");

// adăugați noi rânduri în tabel
.

// creați o comandă pentru a insera noi înregistrări
interogare = "INSERTAȚI ÎN Clienți (CustomerID, CompanyName, ContactName, Phone) VALUES (.)";
SqlCommand cmd = SqlCommand nou (interogare, conn);
SqlParameterCollection pc = cmd.Parameters; pc.Add ("CustomerID", SqlType.Integer, 0, "CustomerID");
pc.Add ("CompanyName", SqlType.String, 0, "CompanyName");
pc.Add ("ContactName", SqlType.String, 0, "ContactName");
pc.Add ("Telefon", SqlType.String, 0, "Telefon");
da.InsertCommand = cmd;
da.Update (tabel);

Această abordare poate fi folosită și atunci când transmiteți actualizări către baza de date utilizând procedurile stocate. Să presupunem că numele procedurii stocate pentru adăugarea unui nou client este spInsertCustomer. Apoi codul nostru se va schimba după cum urmează:

OleDbCommand cmd = nou OleDbCommand ("spInsertCustomer", conn);
cmd.CommandType = CommandType.StoredProcedure;
OleDbParametruCollection pc = cmd.Parameters;
pc.Add ("CustomerID", SqlType.Integer, 0, "CustomerID");
pc.Add ("CompanyName", SqlType.String, 0, "CompanyName");
pc.Add ("ContactName", SqlType.String, 0, "ContactName");
pc.Add ("Telefon", SqlType.String, 0, "Telefon");

Folosind CommandBuilder

CommandBuilder generează interogări SQL accesând baza de date pentru a obține metadate despre tabele. Pentru a utiliza CommandBuilder, trebuie îndeplinite următoarele condiții: 1. Interogarea returnează date dintr-un singur tabel;
2. Cheia primară este definită în tabel;
3. Cheia primară este în rezultatele interogării.
Următoarea este un exemplu de utilizare a CommandBuilder.

string con = "Provider = SQLOLEDB; Sursa de date = (local) \\ NetSDK; InitialCatalog = Northwind; Trusted_Connection = Da;";
șir de interogare = "SELECTă ID-ul de comandă, ID-ul produsului, cantitatea, unitatea de preț din [Detalii comandă]";
OleDbDataAdapter da = nou OleDbDataAdapter (strSQL, strConn);
OleDbCommandBuilder cb = nou OleDbCommandBuilder (da);
da.InsertCommand = cb.GetInsertCommand ();
da.Update (tbl);

Utilizarea Expertului pentru configurarea adaptorului de date

Unul dintre scopurile expertului este de a crea logica pentru actualizarea bazei de date. În al patrulea pas al expertului, comanda Opțiuni avansate afișează un dialog în care puteți specifica dacă doriți sau nu să creați comenzi pentru inserarea, actualizarea și ștergerea înregistrărilor din baza de date.

Lucrul cu date offline în, ado

În a treia etapă a expertului, puteți specifica modul de transferare a actualizării în baza de date: utilizând interogări SQL, utilizând o procedură stocată existentă sau creând o nouă procedură stocată. Nu sunt necesare pași suplimentari pentru a crea logica de actualizare.

Lucrul cu date offline în, ado

Articole similare