Nello scorso articolo sulla connessione ai dati secondo ADO.NET, abbiamo detto che con la classe DataSet è possibile gestire una vera e propria cache disconnessa che può contenere viste provenienti da fonti diverse, questa classe è quindi un mini-database in memoria che consente di gestire e rappresentare le informazioni sia in XML che con una vista relazionale. Il modello ad oggetti del DataSet è costituito da una serie di collezioni di oggetti nidificati. La collezione delle Tables (DataTable) al cui interno troviamo Rows (DataRow), Columns (DataColumn) e Constraints (Constraint) consentono di navigare in un DataSet, inserire, modificare ed eliminare i dati, in particolare i Constraints sono oggetti che rappresentano le regole di validazione per l’inserimento dei dati nelle Tables, in base ad eventuali chiavi interne o esterne impostate sulla tabella. Oltre alle Tables nel DataSet troviamo un’altra importante collezione, si tratta di Relations (DataRelation) che rappresentano le relazioni stabilite tra le tabelle presenti nel DataSet.
Abbiamo detto che in un DataSet possiamo caricare o salvare il contenuto anche attraverso Stream XML, siano essi file, stream in memoria o di rete. Vediamo quindi un esempio concreto nel quale caricheremo i dati da un file XML utilizzando gli oggetti forniti da DataSet. Come prima operazione da fare è creare un file XML contenente ad esempio i nostri clienti, inventati:
<?xml version="1.0" encoding="utf-8"?> <Clienti> <Cliente IDCliente="1" RagSoc="De Tommasi Inventato Snc"> <Ordine IDOrdine="1" IDCliente="1" Data="01/05/2010"></Ordine> <Ordine IDOrdine="2" IDCliente="1" Data="07/08/2010"></Ordine> <Ordine IDOrdine="3" IDCliente="1" Data="03/04/2010"><Ordine> </Cliente> <Cliente IDCliente="2" RagSoc="Testing Consulting Srl"> <Ordine IDOrdine="1" IDCliente="2" Data="06/06/2010"></Ordine> <Ordine IDOrdine="2" IDCliente="2" Data="12/07/2010"></Ordine> <Ordine IDOrdine="3" IDCliente="2" Data="15/11/2010"></Ordine> </Cliente> <Cliente IDCliente="3" RagSoc="Prova Test Spa"> <Ordine IDOrdine="1" IDCliente="3" Data="14/03/2010"></Ordine> <Ordine IDOrdine="2" IDCliente="3" Data="22/08/2010"></Ordine> <Ordine IDOrdine="3" IDCliente="3" Data="28/11/2010"></Ordine> </Cliente> </Clienti>
Successivamente creiamo il programma console in C# per caricare questo file XML:
using System; using System.Data; namespace BaseApp { class Program { static void Main(string[] args) { Console.WriteLine("Mi appresto a caricare il file XML"); DataSet ds = new DataSet(); ds.ReadXml("Clienti.xml"); Console.WriteLine("Ho caricato il file XML e leggo le tabelle..."); foreach (DataTable dt in ds.Tables) { Console.WriteLine("\n\nLeggo le righe della tabella: {0}...\n", dt.TableName); foreach (DataRow dr in ds.Tables[dt.TableName].Rows) { if (dt.TableName == "Cliente") Console.WriteLine("{0}", dr["RagSoc"].ToString()); else Console.WriteLine("{0}", dr["Data"].ToString()); } } ds.Dispose(); Console.WriteLine("\n\nPremi un tasto per terminare..."); Console.ReadKey(); } } }
Il codice mostrato è molto semplice e visualizza perfino come iterare sulle collezioni di tabelle. Abbiamo istanziato una variabile DataSet che consente con una semplice funzione di leggere il contenuto di un file XML, da qui si nota la completa integrazione tra il DataSet ed i file in questo formato universalmente riconosciuto per trasferire dati tramite rete, per poi iterare le collezioni di tabelle e righe che non sono altro che i campi stessi. Al termine chiudo il tutto con la funzione Dispose().
In un prossimo articolo vedremo come inserire nuove righe nelle tabelle e come modificare quelle esistenti, per poi spiegare come crearne di nuove al volo in formato XML con la creazione anche dello schema. Per qualsiasi problema o domanda potete iscrivervi al nostro forum.