Panoramica | ||
Semplice accesso a SQL Server in C# |
Praticamente tutte le applicazioni hanno la necessità di interrogare o aggiornare dati persistenti memorizzati in file piatti, database relazionali o altri tipi di supporto di memorizzazione. Per ovviare a tale necessità, il .NET Framework include ADO.NET, un sottosistema per l'accesso ai dati ottimizzato per ambienti N-tier ed interoperabile con l'XML ed i documenti XML. ADO.NET è stato progettato per gli ambienti debolmente accoppiati. Come il nome stesso implica, ADO.NET rappresenta l'evoluzione di ADO (ActiveX Data Objects). ADO.NET è stato pensato per fornire servizi per l'accesso ai dati ad applicazioni scalabili e servizi basati sul Web. ADO.NET mette a disposizione API ad elevate prestazioni per modelli di dati sia connessi sia disconnessi particolarmente adatti alla restituzione di dati alle applicazioni Web. Quando si sviluppano applicazioni, i dati vengono utilizzati nei modi più disparati. In alcuni casi, ad esempio, l'obiettivo potrebbe essere quello di mostrare semplicemente i dati in una form. In altre situazioni, potrebbe essere necessario condividere le informazioni con altre aziende. Architettura dati disconnessa Nelle tradizionali applicazioni two-tier, le componenti stabiliscono una connessione ad un database e la mantengono aperta per l'intera durata dell'esecuzione. Per svariati motivi, un tale tipo di approccio risulta decisamente poco pratico in numerose applicazioni:
Per tutti questi motivi, l'accesso ai dati in ADO.NET è stato progettato sulla base di un'architettura disconnessa. Le applicazioni rimangono connesse al database solamente per il tempo necessario ad estrarre o aggiornare i dati. Poiché il database non risulta legato a connessioni potenzialmente inattive, può essere utilizzato da moltissimi utenti. Memorizzazione dei dati in dataset Da sempre le più comuni operazioni sui dati consistono nell'estrarli da un database, nel visualizzarli, elaborarli o inviarli ad un'altra componente. Molto spesso, l'applicazione necessita di elaborare non un solo record, ma un insieme di record; ad esempio, l'elenco dei clienti che hanno effettuato ordini in giornata. Spesso l'insieme di record richiesto dall'applicazione deriva da più tabelle: i clienti e tutti i loro ordini, tutti gli autori di nome "Smith" ed i relativi libri, ad altri insiemi simili di record correlati. Una volta estratti i record, generalmente l'applicazione li gestisce come gruppo. Ad esempio, l'applicazione potrebbe consentire all'utente di navigare tra tutti gli autori di nome "Smith", esaminare i libri di un particolare autore, passare al successivo e via dicendo. In un modello di dati disconnesso, non è pratico accedere al database ogni volta che l'applicazione deve elaborare il record successivo. (Così facendo si vanifica il vantaggio di lavorare con i dati disconnessi). La soluzione, pertanto, consiste nel memorizzare temporaneamente i record estratti dal database e lavorare su questo insieme temporaneo. Un dataset non è altro che un insieme di record estratti da un database e memorizzati in una cache local, che e si comporta come store di dati virtuale - include una o più tabelle che si basano sulle quelle di uno o più database e può includere informazioni sulle relazioni tra le tabelle ed i vincoli sui dati in esse contenuti. I dati nel dataset rappresentano generalmente una versione molto ridotta di ciò che è contenuto nel database. Tuttavia, è possibile utilizzarli come se fossero dati reali. Durante questa fase, si rimane disconnessi dal database, che a sua volta è libero di effettuare altre operazioni. Naturalmente, è necessario aggiornare spesso i dati nel database (sebbene non con la stessa frequenza con cui è necessario estrarli). A questo proposito è possibile effettuare le operazioni di aggiornamento sul dataset, e queste verranno propagate al database sottostante. Un punto importante è che il dataset è un contenitore di dati passivo. Per estrarre effetivamente i dati da un database e (eventualmente) scriverli, occorre utilizzare un data adapter. Un data adapter contiene le istruzioni che consentono di popolare una singola tabella del dataset ed aggiornare la corrispondente tabella del database. Le istruzioni sono metodi che incapsulano codice SQL, come il riferimento ad una stored procedure. Pertanto, il metodo Fill può invocare un'istruzione SQL quale SELECT au_id, au_lname, au_fname FROM authors che viene eseguita ogni volta che il metodo viene chiamato. Dati resi persistenti come XML I dati devono essere spostati da un data store al dataset, e da qui a varie componenti. In ADO.NET, il formato predefinito per il remoting dei dati è l'XML. Quando è necessario rendere persistenti i dati al di fuori del database (ad esempio, all'interno di un file), li si memorizza come XML. Se si ha a disposizione un file XML, è possibile utilizzarlo come sorgente dati e per creare un dataset. Infatti, in ADO.NET, l'XML rappresenta il formato fondamentale per la condivisione dei dati. Quando si condividono i dati, le API di ADO.NET creano automaticamente file o stream XML sulla base delle informazioni presenti nel dataset e li inviano ad un'altra componente. Questa, a sua volta, può invocare API simili per restituire l'XML ad un dataset. La scelta su XML è caduta per diversi motivi, ad esempio:
Fonti: .NET Framework SDK Evaluation Guide |