ADO.NET è il componente per l'accesso ai dati del
Microsoft .NET Framework, è una evoluzione del precedente componente ADO con cui ha pochi punti in comune e rappresenta una vera e propria rivoluzione per svariati motivi che passeremo in rassegna nei vari articoli, in ogni caso coloro che possiedono già una certa familiarità con ADO non faranno molta fatica ad apprendere le funzionalità e le caratteristiche del nuovo componente di casa Microsoft.
Capire la struttura del componente ADO.NETCome tutti gli altri componenti del
.NET Framework,
ADO.NET consiste di un insieme di oggetti che interagiscono fra loro per svolgere una determinata funzione, per questo motivo in questo primo articolo ci concentreremo di più sulla parte teorica per capire bene da quali oggetti è composto l'intero namespace e come sono legati fra loro. La figura sottostante mostra una vista semplificata degli oggetti che compongono ADO.NET.
ADO.NET è composto da due componenti fondamentali il
Data Provider (di solito anche chiamato
Managed Provider, che mantiene la connessione con la sorgente dati fisica) e il
DataSet (che rappresenta i dati attuali, ovvero i dati su cui si sta lavorando). Entrambi i componenti possono comunicare con i
Data Consumers , ovvero i fruitori dei loro servizi, come, ad esempio una WinForm o una WebForm.
ADO.NET Data ProvidersIl
Data Provider è specifico per ogni fonte dati (data source), il .NET Framework 1.0 include due Data Providers : uno generico per la comunicazione con data source di tipo OLE DB e uno specifico per Microsoft SQL Server versione 7 o superiore. Dalla versione del Framework 1.1 sono stati aggiunti anche l'
ODBC Data Provider e l'
Oracle Data Provider.
Quasi tutti questi providers contengono gli stessi oggetti, si differenziano per il nome (Es :
SQLConnection,
OleDbConnection,
OracleConnection, ecc.) e per alcune proprietà e metodi.
Oggetto ConnectionL?oggetto
Connection rappresenta la connessione fisica verso la sorgente dati e le sue proprietà variano in base al tipo di Data Providers , i suoi metodi più importanti e usati permettono di:
- aprire e chiudere una connessione
- cambiare il database
- utilizzare le transazioni
Oggetto CommandL?oggetto
Command rappresenta una istruzione SQL o una Stored Procedure da eseguire sulla sorgente dati. Può essere creato e utilizzato su una specifica connessione indipendentemente da altri oggetti oppure può essere utilizzato dall? oggetto
DataAdapter per il trasferimento di dati dal DataSet alla sorgente dati vera e propria. L?oggetto Command supporta istruzioni SQL o stored procedure che ritornano un singolo valore, uno o più record o alcun valore.
Oggetto DataReaderL?oggetto DataReader permette di ottenere uno stream di dati (un Recordset per utilizzare un termine tecnico utilizzato in ADO),di tipo forward-only o read-only, dal data source in maniera rapida e facile.Non può essere creato direttamente via codice ma viene restituito dall?esecuzione del metodo
ExecuteReader dell?oggetto Command.
Bisogna inoltre sottolineare un'importante limitazione, è possibile infatti aprire un solo DataReader per connessione mentre dalla versione del .NET Framework 2.0 sarà possibile aprire DataReader multipli. Nessuno vi vieta però di aprire più connessioni per avere più DataReader.
Oggetto DataAdapterL?oggetto
DataAdapter è forse quello più complesso di ADO.NET; il suo ruolo è quello di fungere da ponte tra l?oggetto Connection e l?oggetto DataSet. Il DataAdapter contiene quattro oggetti Command al suo interno : SelectCommand, UpdateComamnd, InsertComamnd e DeleteComamnd. Il primo comando viene utilizzato per riempire il DataSet tramite il metodo Fill e tutti gli altri comandi vengono chiamati in automatico per trasferire le informazioni contenute nel DataSet alla sorgente dati a seconda se nel DataSet uno o più record sono stati aggiornati,inseriti o eliminati.
Oggetto DataSetIl componente DataSet non è altro che la rappresentazione dei dati contenuti in memoria centrale, la figura sottostante mostra la sua struttura:
Può essere concepito come una copia in memoria della sorgente dati fisica con tutte le tabelle e le relazioni esistenti, è importante capire che il DataSet non è assolutamente collegato direttamente al data source e che non conosce la provenienza dei dati, infatti può accettare dati di svariato tipo e da fonti dati di tipologia varia. Per questo motivo si dice che il DataSet lavora in modalità
"Disconnessa".
Il DataSet, a sua volta, è composto da altri due oggetti importanti : il
DataTable Collection e il
DataRelation Collection.
Il DataTable Collection contiene zero o più oggetti
DataTable che, a loro volta, sono composti da tre Collections:
-
Columns (Colonne)
-
Rows (Righe/Records)
-
Constraints (Vincoli)
La Collection
del DataTable contiene i dati attuali definiti dalla Collections Columns, per ogni Row (Riga o Record), il DataTable mantiene i valori originali , quelli correnti e/o quelli (nuovi) proposti.
La Collection Constraints contiene zero o più oggetti Constraints, tanti quanti sono i Constraints presenti nel Database originale e il ruolo è lo stesso, ovvero mantenere l?integrità dei dati anche in modalità disconessa.
ADO.NET supporta due tipi di Constraints :
- ForeignKeyConstraints che serve a mantenere l?integrità relazionale (relazioni tabelle padre-figlio )
- UniqueConstraints che mantiene l?integrità dei dati (righe non duplicate).
Il DataRelationCollection contiene zero o più oggetti DataRelations che servono a navigare tra le tabelle, ovvero partendo da una certa riga di una tabella si arriva ad una o più righe di altre tabelle che sono appunto legate a quella di partenza tramite una relazione, il classico esempio è la relazione tra la tabella Ordini e la tabella DettagliOrdini.
Conclusioni
In questo articolo abbiamo introdotto il nuovo componente Microsoft ADO.NET spiegando a cosa serve e soprattutto da quali e quante parti è composto e come queste interagiscono tra loro.
Come abbiamo potuto vedere ADO.NET è un componente molto complesso e potente che richiede una profonda conoscenza strutturale prima di poterlo utilizzare in maniera adeguata per sfruttare al massimo le sue potenzialità, per questo nei prossimi articoli continueremo ad approfondire lo studio dei suoi componenti inserendo anche qualche riga di codice con esempi pratici.