Obiecte DataReader și DataView, în aplicații 2

Obiecte DataReader ADO.NET și DataView, utilizarea în aplicații ASP.NET 2.0

Acest modul se concentrează pe modelul de obiect suplimentar vomzozhnostyam ADO.NET.

In ultimul modul ne-am uitat la modul de a extrage date de la sursa folosind obiectul DataSet. Cu toate acestea, datele de la sursa pot fi preluate și prin mijloace obiect DataReader. DataReader reprezintă un flux de date returnat de la sursă, în acest caz, debitul este întotdeauna unidirecțional (de la o sursă la un client) și este accesibil numai pentru citire.

Ceea ce este diferit de DataReader DataSet:

· Datele pot fi accesate prin intermediul DataReader numai pentru citire;

· DataSet pot avea acces la mai multe tabele la sursă. DataReader - este întotdeauna datele returnate doar echipa care a efectuat la sursă;

· DataSet funcționează în modul de deconectare, DataReader - numai compuși;

· DataSet poate fi conectat la mai multe controale pe formularul Web, DataReader - un singur;

· DataReader este mai rapid, dar datele sunt transferate într-o singură direcție;

· Interfață grafică cu utilizatorul pentru a lucra cu DataReader în VS. NET nu este furnizat.

Dacă vă conectați la SQL Server dintr-o aplicație A SP. NET. trebuie să alegeți între autentificare S QL de autentificare Server și Windows. Când S QL autentificare server nume de utilizator și o parolă pentru conectarea va trebui să se înregistreze în HTML (și, eventual, trece-l într-o formă neprotejată peste HTTP. Dacă utilizați un formular pentru a introduce numele de utilizator și parola). Înregistrează numele de utilizator și parola în șir onnection C. care pot fi generate prin mijloace standard VS. NET.

Dacă utilizați Windows autentificare (mai mult decât modul recomandat), apoi numele de utilizator și parola nu sunt transmise prin rețea, precum și un apel la serverul S QL se face în numele contului special de ASPNET - și este necesar să se elibereze autorizațiile necesare.

Acum, cum să lucreze cu ADO.NET nu obiecte printr-o interfață grafică, și software-ul.

Este inutil să se stabilească o conexiune este realizată folosind SqlConnection sau OleDbConnection. Principalele și practic proprietatea doar a acestui obiect - ConnectionString, și care conține toate informațiile despre conexiunea. Această proprietate poate fi transmisă ca parametru pentru a crea acest obiect:

Dim strConn Ca String = _

"Sursa de date = localhost;" _

"Catalog Initial = northwind;" _

Conn Dim Ca nou SqlConnection (strConn)

Atunci când se utilizează obiect interacțiunea DataSet cu sursă reală produce DataAdapter obiect încorporat (acestea sunt, ca de obicei, două soiuri - SqlDataAdapter și OleDbDataAdapter). Fizic DataAdapter - un set de SQ L -command și un pointer la obiectul de conexiune. Principalele proprietăți ale DataAdapter:

· SelectCommand - reprezintă o comandă prin care datele sunt returnate de la sursa;

· InsertCommand, UpdateCommand, DeleteCommand - titlu clar.

puteți, de exemplu, pentru a crea un obiect atât de DataAdapter:

„Crearea unei conexiuni

Conn Dim Ca nou SqlConnection _

( "Sursa de date = localhost; catalog inițial = puburi;" _

"Securitate integrată = true; persista informatii de securitate = true")

„Crearea DataAdapter

Dim da Ca Nou SqlDataAdapter _

( "Select * de la autori", Conn)

Acum este timpul pentru a crea un obiect DataSet. Însăși creația se face ușor:

DS Dim Ca nou set de date ()

dificil de a crea în el obiectele necesare încorporate, cum ar fi DataTable. Cel mai simplu mod de a face acest lucru folosind metoda de umplere a DataAdapter obiectului:

În DataSet DataTable obiect creat automat autori pe nume, structura și conținutul care este determinat prin faptul că ancheta a revenit definit pentru obiect DataAdapter. Consultați obiectul este posibil prin numele său în colecția de tabele

sau pur și simplu prin numărul:

Accesul la coloane și rânduri specifice pot fi obținute prin colectarea de coloane și rânduri DataTable obiecta:

col Dim Ca DataColumn

Pentru fiecare col In ds.Tables (0) .Columns

DS .Tables ( "Autori") .Columns .Count

Consultați anumite câmpuri din tabel poate fi atât prin numărul lor (rând / coloană) și de numărul de linie și numele coloană:

Plimbare ciclu prin toate înregistrările din DataTable obiect, creat pe baza tabelului Autori. și a pus într-un șir de valori variabile în a doua coloană, iar coloana cu numele au _ lname posibil, astfel:

r Dim Ca DataRow

Dim ca șir de str

Pentru fiecare r în ds.Tables ( „Autori“). Rânduri

str = R ( "au_lname")

DataSet se poate lega la controlul sub forma direct, și este posibil să se utilizeze un DataView obiect intermediar. DataView (cum ar fi View în baza de date) - o vedere personalizată a datelor din setul de date. După ce creați un DataView poate fi utilizat pentru datele de sortare, filtrare, căutare, editare, și de navigare.

Pentru oricare dintre obiect DataView DataTable cu setările implicite este creat în mod automat. Ia link-ul poate fi atât:

Dim dv Ca DataView = ds.Tables ( "Autori"). Defaultview

Desigur, puteți crea propriul dvs. și Dataview, în care, de exemplu, vei primi interesat doar de înregistrare:

Dim DV Ca nou DataView (ds.Tables ( "autori"))

După crearea setului de date cu toate sub-obiecte, puteți crea controale pentru lucrul cu datele privind forma și leagă-l la setul de date.

De exemplu, avem un Datagrid obiect:

să-l lega la DataSet, puteți folosi următorul cod:

Implicit, controlul este legat la primul aspect DataTable (indice zero). Pentru a afișa un obiect DataTable diferit sau un obiect DataView, trebuie să utilizați proprietatea DataMember (așa cum este arătat mai sus) sau de a transmite informații despre tabelul dorit direct DataSource proprietate:

În mod similar, controlul poate fi transmis la obiectul de afișare în loc DataTable DataView obiect:

Dim DV Ca nou DataView (ds.Tables ( "autori"))

dv.RowFilter = "= de stat 'CA'"

Acum - despre interceptarea erorilor atunci când se lucrează cu obiecte ADO.NET.

Cel mai adesea găsit următoarele erori:

· Este imposibil să se stabilească o conexiune (nu serverul de rețea este oprit, etc) de tratare a erorilor trebuie, desigur, a pus pe deschiderea unei conexiuni. Codul care se ocupă de cele mai frecvente greșeli atunci când deschideți conexiunea ar putea arata astfel:

Dim Conn Ca nou SqlConnection (.)

da Dim Ca nou SqlDataAdapter (. Conn)

DS Dim Ca nou set de date ()

Prinde EX1 Ca System.Data.SqlClient.SqlException

Selectați Case ex1.Number

lblErrors.Text = lblErrors.Text _

( "Nume server nevalid")

Case 156, sintaxa SQL rău 170“

lblErrors.Text = lblErrors.Text _

Cazul 207 „nume de câmp rău în selectați

lblErrors.Text = lblErrors.Text _

( „Numele de coloană nevalid“)

Cazul 208 „nume de tabel rău în selectați

lblErrors.Text = lblErrors.Text _

( „Nume de obiect nevalid“)

lblErrors.Text = lblErrors.Text _

( „Nume de utilizator nevalid“)

lblErrors.Text = lblErrors.Text _

lblErrors.Text = lblErrors.Text _

Prinde EX2 Ca System.Exception

lblErrors.Text = lblErrors.Text _

( „Excepție neașteptată:“ ex2.Message "")

· Este imposibil de a executa o comandă pe server (sau în performanță au existat unele probleme). Cel mai frecvent motiv - sintaxa invalidă, a declarat în mod greșit numele obiectului, etc. Folosit pentru a intercepta aceeași excepție obiect Sql, care prevede colectarea de erori pentru toate erorile și avertismentele care sunt returnate la server:

Dim erData Ca SqlClient.SqlErrorCollection = ex1.Errors

Dim i ca integer

Pentru i = 0 Pentru erData.Count - 1

lblErrors.Text = ( "Eroare" eu ":" _

erData (i) .Number "" _

erData (i) .class "" _

erData (i) .Message "
„)

Pentru obiectele sqlerror, care alcătuiesc această colecție. are următoarele proprietăți.

· Clasa - eroare de nivel de severitate, în conformitate cu gradațiile SQL Server

· LineNumber - numărul liniei în lot sau procedură stocată pentru a fi executate că există o eroare

· Mesaj - o eroare de text

· Numărul - număr de eroare

Una dintre marile caracteristici date este faptul că obiectul DataSet poate consta din mai multe obiecte DataTable. și în care fiecare obiect DataTable pot fi obținute de la sursa.

Pentru a umple setul de date obiecte DataTable, veți avea nevoie de dvs. obiect DataAdapter pentru fiecare DataTable. Un alt punct: cum să lucreze cu DataAdapter poate fi important dacă introducerea datelor din formularul în tabel, legate de primar / ke y străine. Desigur, trebuie să efectuați mai întâi o inserție într-un tabel în cazul în care cheia primară printr-un DataAdapter corespunzător. De exemplu, avem două tabele: clienți și comenzi. Punerea ei în setul de date poate arata astfel:

Conn Dim Ca SqlConnection

daCustomers Dim Ca SqlDataAdapter

daOrders Dim Ca SqlDataAdapter

DS Dim Ca nou set de date ()

„Crearea unei conexiuni la baza de date Pub-uri

conn = New SqlConnection ( "sursă de date = localhost;" _

"Securitate integrată = true; catalogul inițial = Northwind")

„Creați prima DataTable

daCustomers = Nou SqlDataAdapter _

( "Select CustomerID, CompanyName de la clienți", Conn)

„sozdaemvtoruyuDataTable

daOrders = Nou SqlDataAdapter _

( "Select CustomerID, IDComandă, ORDERDATE, ShippedDate de comenzi", Conn)

daOrders .Fill (DS. "Comenzi")

Fiecare obiect DataTable trebuie în mod necesar pentru a crea un obiect DataAdapter - utilizarea comună nu va funcționa.

este furnizat setul de date, și un obiect, cum ar fi DataRelation - relații între tabele. Când creați este necesar un DataRelation pentru a determina masa de bază (de exemplu, tabelul cu cheie primară) și copil (de exemplu, străine). Desigur, aceste tabele trebuie să fie distribuite pe coloană și trebuie subliniat. Exemplu de creare a unui DataRelation pentru clienți și comenzi noastre:

„Creați DataRelation: fiecare editor publică multe titluri

Dr. Dim Ca DataRelation

Dim parentCol Ca DataColumn

Dim childCol Ca DataColumn

dr = New DataRelation ( "CustOrders", parentCol, childCol)

Desigur, principalul motiv pentru care a creat obiecte Relație de Date - naviga prin relațiile dintre tabele. În acest scop, metode și G etChildRows GetParentRow. De exemplu, pentru a găsi toate comenzile pentru un client în exemplul nostru, puteți:

currentParentRow = ds.Tables ( "Clienții"). _

Pentru fiecare r currentParentRow.GetChildRows ( "CustOrders")

Casa de discuri 1.Text = R ( "IDComandă") ""

Uneori este convenabil să facă acest lucru într-un spectacol de control numai acele înregistrări legate de înregistrarea selectată în celălalt control. De exemplu, utilizatorul selectează o intrare Datagrid pentru client, și într-un alt control al afișarea ordinelor făcute lor:

Dim parentTableView Ca Nou _

Dim currentRowView Ca DataRowView = _

Acest lucru se face prin DataView. care este filtrat folosind înregistrarea selectată în celălalt control.

DataSet - cea mai bună alegere pentru aplicații Web cu funcționalitate bogată. Cu toate acestea, dezvoltatorii sunt de multe ori este nevoie de mai multă funcționalitate - au nevoie doar de o viteză maximă de a efectua o interogare simplă și de a folosi rezultatele. În această situație, poate fi convenabil de a utiliza DataReader.

După cum sa menționat deja, obiect DataReader este folosit pentru a obține date de la sursă într-un mod de read-only / numai înainte.

Este deosebit de util atunci când:

- Trebuie să faci cât mai repede posibil la sursa unei cereri elementare;

- atunci când, dimpotrivă, sursa de date pentru a obține mai multe (zeci de mii de înregistrări), și le plasează în memorie nu este de dorit. Atunci când utilizați DataReader stocate în memorie, în același timp, nu mai mult de o singură înregistrare cu sursa.

DataReader poate lega la un singur control de pe formular.

DataReader rulează întotdeauna mai rapid și utilizează mai puțină memorie decât DataSet.

În ADO.NET oferă două tipuri de DataReader: SqlDataReader și OleDbDataReader. Completarea acestor două obiecte se realizează folosind aceeași metodă ExecuteReader.

DataReader Diferența fundamentală constă în faptul că, spre deosebire de DataAdapter, în cazul în care conexiunea se deschide și se închide automat atunci când DataReader pentru a deschide și închide conexiunea, va trebui să manual.

De obicei dataReader sau utilizate într-un ciclu, sau este legat de control. Cu toate acestea, codul în orice caz, trebuie să scrie de mână.

Care este secvența de lucru cu DataReader:

1) se deschide conexiunea la sursa

2) a crea un obiect de comandă

3) dintr-un obiect creat DataReader comandă

4) invocata metoda ExecuteReader

5) obiect DataReader este utilizat în program

6) obiectul DataReader închide

7) decuplează de la sursa

„Crearea de conectare și comandă obiecte

Conn Dim Ca nou SqlConnection _

( "Sursa de date = localhost; integrat de securitate = true;" _

cmdAuthors Dim Ca nou SqlCommand _

( "Select * de la autori", Conn)

„Crearea de date DataReader și afișare

Dr. Dim Ca SqlDataReader

Face în timp ce dr.Read ()

lstBuiltNames.Items.Add (dr ( "au_lname") + "" + _

„Închide DataReader și conectare

Atunci când se lucrează cu DataReader întotdeauna recomandat să utilizați structura try. Catch. Final, pentru a se asigura că, chiar și în caz de eșec conexiunea va fi abandonată (în caz contrar se poate întâmpla ca conexiunea va închide pe termen nelimitat).

„Utilizați datele returnate în DataReaders

Prinde e ca excepție

„Manipulați eroarea

După metoda ExecuteReader se numește, un DataReader este setat automat în poziția înainte de prima înregistrare a revenit.

Pentru a accesa de fapt, datele printr-un DataReader, puteți

Citiți utilizarea metodei într-o buclă. Această metodă după DataReader intrările returnează null - această valoare și să alocați o verificare în ciclul:

Face în timp ce dr.Read ()

lblName.Text = Dr ( "au_fname")

eșantionarea el de date se face pur și simplu apel la câmp după numele sau ordinal acestuia, și puteți utiliza, de asemenea, metoda get corespunzătoare (getString, GetDateTime, GetInt32 etc.)

lblName.Text = dr.GetString (1) + "" + _

Obțineți metoda cu tipul de date este mai rapid, deoarece ADO.NET nu este necesară pentru a face față cu tipurile de date.

Închideți conexiunea manual, după ce ați terminat cu ajutorul DataReader - în mod necesar, deoarece în caz contrar acesta va rămâne agățat.

Pentru comoditate, informațiile de afișare obținute prin DataReader recomandat sa se leaga de elementul de control asupra formei (de exemplu, DataGrid familiar). Acesta utilizează același control DataSource proprietate, valoarea obiectului care este transmis DataReader:

Conn Dim Ca nou SqlConnection _

( "Sursa de date = localhost; integrat de securitate = true;" _

cmdAuthors Dim Ca nou SqlCommand _

( "Select * de la autori", Conn)

„Legați DataReader la un listbox

Dr. Dim Ca SqlDataReader