Articolul DataReader și accesul la date
DataReader și datele de acces
În următorul articol din această serie ne vom uita la primul obiect care ne va permite să acceseze datele stocate într-o bază de date relațională, - DataReader.
De la comandă și DataReader asociat suficient de strâns, în ultimul articol, am menționat în treacăt ea. Acum este timpul să se familiarizeze cu DataReader mai detaliat.
Așa cum am menționat mai devreme, în cazul în care rezultatul comenzi SQL prin comanda este un set de date, ca rezultat al metodei Command.ExecuteReader crea DataReader. prin care puteți accesa rezultatul.
La baza ei este un DataReader înregistrări flux de read-only, în care se pot muta doar înainte, secvențial de la înregistrare pentru a înregistra. Lucrul cu ei este foarte similar cu citirea datelor dintr-un fișier secvențial.
În procesul de citire la un moment dat în memoria calculatorului client este unul și numai înregistrarea curentă. De aceea DataReader necesită foarte puțină memorie a clientului, chiar dacă dimensiunea totală a datelor eșantionului este mare.
Desigur, pentru astfel de economii au întotdeauna ceva să plătească. În acest caz, prețul este în mod constant conexiune deschisă la o sursă de date, care creează o sarcină în rețea, și necesită, de asemenea, un server de baze de date alocarea unor resurse pentru a sprijini conexiunea cu clientul (în cazul în care sursa de date este un SQL-server).
Aceste caracteristici dataReader impun anumite limitări privind metodele de utilizare a obiectului. Cu toate acestea, există mai multe aplicații pentru care această funcționalitate este suficient. De exemplu, dacă doriți să selectați câteva date din baza de date și afișa raportul sub forma unei liste, un DataReader destul de a face față cu succes cu această problemă, nu se încarcă cu memoria calculatorului client, chiar dacă trebuie să se ocupe de o cantitate semnificativă de date.
sprijin DataReader pe partea de server Dacă ați ocupat deja mai devreme, cu baze de date prin intermediul ADO, OLE DB sau ODBC, fără îndoială, sunteți familiarizați cu conceptul cursorului.
În ADO.NET, în mod clar nu ne-am întâlni conceptul cursorului, deoarece nu există nici un Recordset. care a fost direct legat de acesta. Cu toate acestea, la nivelul inferior, desigur, principiul interacțiunii cu serverele de baze de date nu sunt modificate, iar cursoare sunt încă prezente, chiar dacă este ascunsă de programator.
După cum s-ar putea ghici, DataReader pentru a accesa datele folosind cursorul read-only înainte pe partea de server (read-only numai-forward cursorul server-side).
Printre metodele dataReader nu veți găsi designer. Astfel, pentru a crea în mod independent, un obiect nu reusesti. Cu toate acestea, într-o astfel de unitate ar fi încă puțin sens, din moment ce ai nevoie, de asemenea, pentru a umple obiectul de date de la sursa, iar noi încă nu au acces la ele.
DataReader este creată prin apelarea metodei obiect ExecuteReader comandă:
OleDbDataReader myReader = myCommand.ExecuteReader (CommandBehavior.CloseConnection);
După aceea puteți începe lucrul cu obiectul.
Numărul de rânduri modificate, inserate sau șterse ca urmare a unei instrucțiuni SQL.
Profunzimea are sens, dacă un șir de caractere aparține unui set de ierarhic (ca prin OLE DB, puteți accesa nu numai bazele de date relaționale). MS SQL Server nu acceptă ierarhie, astfel încât SqlDataReader.Depth returnează întotdeauna 0.
Prin Postul poate avea acces la valoarea datelor coloanelor ca înregistrarea curentă după numărul și după nume. Ambele formate sunt acceptabile:
int i = (int) myReader.Item [1];
string s = (string) myReader.Item [Name];
(Desigur, cu condiția ca tipul de reguli de conversie nu sunt încălcate).
Se deplasează la următoarea înregistrare
Închide - iese DataReader. Asigurați-vă că pentru a apela această metodă când a terminat cu obiectul, în caz contrar obiectul Connection Oates indisponibile pentru alte operațiuni de la sursa de date.
GetDataTypeName și GetFieldType posibil să se determine denumirea tipului de date și coloana reală tip de date cu un număr predeterminat.
Getname și GetOrdinal sunt complementare. Primul vă permite să specificați numele coloanei prin numărul său, iar al doilea, respectiv, în numele numărul coloanei.
De fapt IsDBNull singura modalitate de a determina ce este stocat în această coloană martor, pentru că între tipul de date de tip NET Framework off-line potrivit pentru prezentare.
NextResult folosit pentru a merge la următorul set de date, în cazul în care instrucțiunea SQL sau stocate revine procedură, ca urmare a mai multor seturi de date. Inițial, DataReader este poziționat pe primul set, pentru a accesa următoarea tranziție clară necesară.
Citiți este necesară pentru avans consecvent de-a lungul liniilor de setul de date. Inițial, imediat după poziția curentă de citire DataReader este setat înainte de primul rând al setului de date, astfel încât înainte de utilizare, sunați la numărul de citire a datelor.
În plus față de aceste metode, DataReader include, de asemenea, un set de metode de accesare a valorilor coloanelor care returnează o valoare de tipul specificat. Utilizarea acestor metode este trivială și este clar din numele, asa ca le voi enumera doar în tabelul de referință:
Pe lângă acestea, punerea în aplicare SqlDataReader include, de asemenea un set de metode care returnează tipuri specifice de MS SQL Server. Deoarece acestea sunt practic duplicarea tipuri de date comune, nu văd nici un motiv pentru a locui aici atenția.
In ultimul articol am fost nevoiți să facem fără ca exemplu rularea programului, pentru că nu au mijloacele de a accesa rezultatele interogării bazei de date. Acum este momentul de a consolida în practică abilitățile învățate în studiul materialului și ultima parte a acestui articol. Vom crea o aplicație simplă, dar completă, care afișează inițial o listă a țărilor în care există clienți Northwind firmă ipotetică, ne invită să intre în numele unei țări, și apoi afișează o listă a clienților care locuiesc în țară.
Desigur, mult mai ușor de a construi astfel de aplicații cu numeroase experți care sunt gata pentru a facilita munca, permițând câteva clicuri de mouse pentru a crea secțiuni întregi ale codului finit. Cu toate acestea, pentru a descrie lucrarea cu ei sarcină destul de ingrată, pentru că transmite în mod clar în cuvinte secvența de mișcări și mouse-ul nu sunt atât de simplu, și dezordine în sus poveste lunga serie de capturi de ecran nu vor să. Prin urmare, un exemplu este o aplicație consolă, în care copii ale tuturor relevante pentru obiectele de date sunt create imediat înainte de utilizare de software-ul. Deși este oarecum mai dificil atunci când în curs de dezvoltare o aplicație, dar un astfel de cod poate fi folosit chiar și de către cei care sunt în imposibilitatea de a utiliza VS.NET IDE, și forțat să se stabilească pentru lucrul cu C # compilator de .NET Framework prin linia de comandă.
Pentru a evita potențialele probleme cu diferite codificări chirilică, toate mesajele consola din program sunt afișate în limba engleză. Numărul lor este mic, așa că sper că nu va provoca dificultăți pentru cititorii care au dificultăți cu limba.
În ciuda simplității sale, programul include tot ce ai nevoie pentru a construi o declarație simplă a conținutului bazei de date: a crea o conexiune, cererile de date (simple și parametrizate), ieșirea datelor, de rupere conexiunea la sursa de date și eliberarea de resurse.
folosind System;
folosind System.Data;
folosind System.Data.OleDb;
DataReaderSample spațiu de nume
clasa DataReaderSample
[STAThread]
static void Main (string [] args)
Console.WriteLine ( „Comandă DataReader Exemplu de program \ n „) .;
// crea și conexiune deschisă
string strCnn = @ "Provider = Microsoft.Jet.OLEDB.4.0; Sursa de date = C: \ Program Files \ Microsoft Visual Studio \ VB98 \ NWIND.MDB";
OleDbConnection cnn = new OleDbConnection ();
cnn.ConnectionString = strCnn;
cnn.Open ();
// Crearea de comandă
OleDbCommand cmd = new OleDbCommand ();
cmd.Connection = cnn;
// selectați mai întâi toate țările în care există clienți
string strCmd = "SELECT DISTINCT Țara de la clienți ORDER BY țară";
cmd.CommandText = strCmd;
cmd.CommandType = CommandType.Text;
OleDbDataReader rdr = cmd.ExecuteReader ();
// afișa lista țărilor
Console.WriteLine ( „Lista țărilor clienți locuiesc la“);
în timp ce (rdr.Read ())
// rezultatul acestuia stabilit coloana numărul de ordine
Console.WriteLine (rdr.GetString (0));
rdr.Close (); // nu uitați să închideți DataReader după utilizare!
Console.WriteLine ();
Console.Write ( „Selectați una pe care doriți să obțineți o listă de clienți de la:“);
string ans = Console.ReadLine ();
// încearcă acum să construiască și rula o interogare cu un parametru
strCmd = "SELECT ContactName, CompanyName, ContactTitle de la clienți unde (Țara =?)";
cmd.CommandText = strCmd;
par OleDbParameter = new OleDbParameter ();
par.OleDbType = OleDbType.VarWChar;
par.Value = ans;
cmd.Parameters.Add (par);
rdr = cmd.ExecuteReader ();
Console.WriteLine ( "Clienții din" + ANS + "sunt:");
în timp ce (rdr.Read ())
// în acest caz, pentru o varietate de nume de coloană utilizare în baza de date, mai degrabă decât numerele lor
Console.WriteLine (RDR [ "ContactName"]. ToString () + ""
+ rdr [ "CompanyName"]. ToString () + ""
+ . RDR [ "ContactTitle"] ToString ());
// resurse de eliberare (deși acestea sunt eliberate în mod automat la sfârșitul programului,
// mai bine obișnuiți să le elibereze în mod explicit, imediat după utilizare)
rdr.Close ();
cnn.Close ();