Architettura di ADO.NET

.::Home::.

.::Introduzione::.

1.Panoramica

.::Presentazioni PPT::.

.::Link::.

.::DownLoad::.

 

Nel .NET Framework l'accesso ai dati è gestito dal set di classi chiamato ADO.NET, estensione degli esistenti ActiveX Data Objects (ADO).

I componenti di ADO:NET sono stati progettati per dividere l'accesso ai dati dalla manipolazione degli stessi. A questo scopo si utilizzano i due componenti principali di ADO.NET: il DataSet e il .NET Data Provider.

 DataSet

Il DataSet è il componente chiave dell'architettura di ADO.NET, ed è esplicitamente progettato per accedere ai dati indipendentemente dalla loro sorgente. Esso rappresenta un contenitore, mantenuto in memoria, per un sottoinsieme dei dati del database, come ad esempio il risultato di una query.

Gli oggetti DataSet e Command permettono di creare una cache lato client di uno o più recordset e di elaborarla dopo la sconnessione; infatti DataSet è un oggetto disconnesso, quindi una volta che i dati sono stati caricati al suo interno, la connessione con il database non è più utilizzata finchè non si renda necessario caricare altri dati o aggiornare il server con le modifiche fatte nella copia in memoria delle informazioni.

Il DataSet rappresenta un completo set di dati che includono tabelle, vincoli e relazioni fra le tabelle.

Il modello dell'oggetto DataSet è mostrato qui sotto:

I metodi e gli oggetti in DataSet sono coerenti con quelli nel modello di database relazionale.

DataSet può essere reso persistente, ed è possibile ricaricare i suoi contenuti come XML e il suo schema come uno schema XSD (Schema Definition language).

DataTableCollection
Un DataSet di ADO.NET contiene una raccolta di tabelle (zero o più) rappresentate da un oggetto DataTable.
La DataTableCollection contiene tutti gli oggetti DataTable in un DataSet.
Una DataTable è definita in un namespace System.Data e rappresenta una singola tabella di dati residenti in memoria. Contiene una raccolta di colonne rappresentate da DataColumnCollection che definisce lo schema della tabella. Esso contiene inoltre una raccolta di righe rappresentata da DataRowCollection che contiene i dati della tabella.
Un DataRow mantiene il suo stato originale e tiene inoltre traccia delle modifiche che avvengono sui dati, per una futura sincronizzazione con la sorgente.

DataRelationCollection
Un DataSet contiene le relazioni nel suo oggetto DataRelationCollection. Una relazione rappresentata dall'oggetto DataRelation, associa righe in una DataTable con le righe di un'altra DataTable. E' l'analogo di un join path che può esistere tra le colonne della chiave primaria e della chiave foreign in un database relazionale. Un DataRelation identifica le colonne corrispondenti in due tabelle di un DataSet.
Le relazioni permettono la navigazione da una tabella ad un'altra all'interno di un DataSet. Gli elementi essenziali di un DataRelation sono il nome di una relazione, le due tabelle che sono poste in relazione e le colonne relazionate in ogni tabella. Le relazioni possono essere costruite con più di una colonna per tabella, mediante un array di oggetti DataColumn per le colonne chiave. Quando una relazione è aggiunta alla DataRelationCollection, può essere opzionalmente aggiunto un ForeignKeyContrains che impedisce ogni modifica che potrebbe invalidare la relazione. 

ExtendedProperties
Il DataSet (così come il DataTable e DataColumn) ha una proprietà ExtendedProperties. ExtendedProperties è una PropertyCollection nella quale un utente può inserire informazioni personalizzate, come lo statement SELECT utilizzato per generare un set risultante, o la data e l'ora di quando i dati sono stati generati. La raccolta di ExtendedProperties è resa persistente con le informazioni dello schema per il DataSet (e DataTable e DataColumn).

 

.NET Data Provider

L'altro elemento principale dell'architettura di ADO.NET è il .NET Data Provider i componenti del quale sono progettati per la manipolazione dei dati e un veloce accesso in lettura forward-only.
Il DataProvider si pone nella parte più bassa del flusso dei dati, in quanto ha il compito di comunicare direttamente con il database.

Il .NET Framework viene fornito con due .NET Data Provider: l'SQL Server .NET Data Provider e l' OLE DB .NET Data Provider.

SQL Server .NET Data Provider permette la connessione a Microsoft SQL Server 7.0 e successivi, mediante l'uso del suo oggetto SqlConnection. Le classi di SQL Server .NET Data Provider sono posizionate nel namespace System.Data.SqlClient.
SQL Server Data Provider rappresenta il metodo più efficiente per collegarsi a questo Database Server, in quanto utilizza un protocollo proprietario ottimizzato,

OLE DB .NET Data Provider permette al connessione ad una sorgente OLE DB o a Microsoft SQL Server 6.0 e precedenti [installando l'OLE Provider for SQL Server].
E' la soluzione raccomandata per Oracle.
Il namespace System.Data.Oledbclient contiene le classi del OLE DB Data Provider.

Per stabilire la connessione con SQL Server si utilizza la Security Support Provider Interface (SSPI) che stabilisce un'interfaccia comune tra le applicazioni a livello di trasporto come una remote procedure call (RPC), ed i Security Support Provider (SSP) come Windows Distributed Security. SSPI permette alle applicazioni di utilizzare i diversi modelli di sicurezza disponibili sul computer o in rete senza cambiare l'interfaccia al sistema di sicurezza.

I .NET Data Provider hanno quattro classi chiave che sono derivate dalle interfacce IDbConnection, IDbCommand, IDataReader, IDbDataAdapter che si trovano nel namespace System.Data.

Queste quattro classi si manifestano in SQL Server o OLE DB provider come SqlConnection, OledbConnection per la classe Connection; SqlCommand, OledbCommand per la classe Command; SqlDataReader, OledbDataReader per la classe DataReader; SqlDataAdapter OledbDataAdapter per la classe DataAdapter.

Facciamo ora una breve analisi di queste quattro classi.

La classe Connection.

Questa classe è ereditata dall'interfaccia IDbConnection ed è utilizzata per stabilire le connessioni al database: I comandi inviati al database saranno eseguiti utilizzando questa connessione, che deve essere chiusa esplicitamente dopo l'uso per poterla rendere nuovamente disponibile. Le Connection non sono infatti chiuse implicitamente quando l'oggetto esce dallo scope o è reclamato dal Garbage Collector.

La classe Command.

Ereditata dall'interfaccia IDbCommand, è utilizzata per eseguire comandi Transact SQL o procedure memorizzate sul database.
I Command contengono informazioni che sono inviate al database come query, e come le connessioni sono rappresentate da classi specifiche nei due DataProvider.
Dal punto di vista funzionale, una volta che le connessioni sono state stabilite e i comandi eseguiti, i risultati arrivano in forma di stream. E' possibile accedere a questi stream sia dall'oggetto DataReader che passandoli in un DataSet attraverso un DataAdapter.

La classe Command espone i seguenti metodi:

ExecuteReader: esegue una query o una procedura memorizzata che seleziona record. Ci si aspettano uno o più risultati. Si accedono ai record selezionati con con l'oggetto SqlDataReader e si usa il metodo Read per leggerli.
ExecuteScalar: esegue una query o più probabilmente una procedura memorizzata che restituisce dati. Si differenzia da ExecuteReader in quanto rende solo disponibile, come valore scalare, la prima colonna nella prima riga di un set di risualtati. Ha una sua utilità per certe operazioni statistiche.
ExecuteNonQuery: esegue un comando o una procedura memorizzata che modifica lo stato di una specifica tabella. Ovvero può fare di tutto tranne che una query. Solitamente è utilizzato per inviare comandi INSERT, UPDATE, DELETE, CREATE, SET.
ExecuteXmlReader: costruisce e restituisce un oggetto XmlReader dopo un comando SELECT che sfrutta le proprietà XML di SQL Server 2000.

La classe DataReader.

Ereditata dall'interfaccia IDataReader è utilizzata per leggere i data dal database come un flusso in sola lettura forward only. E' un modo efficiente per recuperare i dati ed ha una scarsa occupazione di memoria perché legge un record alla volta dal database e per questo viene utilizzata per leggere grandi quantità di dati.

Questa classe espone i seguenti metodi:

Read: per leggere le righe nel flusso di dati ottenuto.
NextResult: se esistono più di un set di risultati con questo metodo si può saltare al successivo.

La classe DataAdapter.

Ereditata dall'interfaccia IDbDataAdapter è usata per riconciliare i dati tra il DataSet e il database, in entrambe le direzioni. Questa classe è principalmente usata per interagire con il DataSet che è una sorgente di dati disconnessa.

Questa classe espone i seguenti metodi:

Fill: riempie il DataSet con i dati provenienti dal database e quindi rilascia la connessione rendendo il DataSet disponibile per un esame accurato.
Update: aggiorna il database con le modifiche effettuate sul DataSet

Fonti:

http://www.csharphelp.com/archives/archive103.html
http://www.c-sharpcorner.com/Database/DBOpsInADOPA.asp
http://www.c-sharpcenter.com/Tutorial/Database2.htm
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q301216
http://www.microsoft.com/malaysia/events/past/download/sas/Getting%20The%20Most%20of%20ADO.NET.ppt
http://www.stylusinc.net/technology/microsoft/ado.shtml

.::^top^::.

(2002) A cura di Carlo Becchi