Creazione e Modifica di Database con DataSet ed XML

In uno scorso articolo abbiamo visto come caricare in memoria un file XML attraverso la classe DataSet della piattaforma Microsoft .NET, questa volta vedremo il processo inverso, la creazione di una struttura dati a partire dal DataSet. I metodi chiave che consentono di caricare e salvare uno stream XML in un DataSet sono:

  • ReadXml – permette di caricare le informazioni da uno stream o file.
  • GetXml – permette di estrarre una stringa con l’XML attualmente nel DataSet.
  • WriteXml – permette di salvare il contenuto del DataSet in uno stream o file.
  • ReadXmlSchema – permette di caricare lo schema da uno stream o file.
  • WriteXmlSchema – permette di scrivere lo schema in uno stream o file.
  • InferXmlSchema – permette di caricare uno schema e di adattarlo al contenuto già presente nel DataSet.

Ognuno di questi metodi ha diversi overload che permettono di utilizzare diversi parametri per realizzare le operazioni di scrittura e lettura. Vediamo un esempio pratico in linguaggio C#:

using System;
using System.Data;

namespace BaseApp
{
 class Program
 {
  static void Main(string[] args)
  {
    Console.WriteLine("Mi appresto a scrivere il file XML");

    DataSet ds = new DataSet();

    // Aggiungo le tabelle
    ds.Tables.Add("Ordini");
    ds.Tables.Add("Dettagli");

    // Inserisco i campi
    DataColumn dc = new DataColumn("IDOrdine",
    Type.GetType("System.Int32"));
    dc.ColumnMapping = MappingType.Attribute;
    ds.Tables["Ordini"].Columns.Add(dc);

    dc = new DataColumn("Numero", Type.GetType("System.String"));
    dc.ColumnMapping = MappingType.Attribute;
    ds.Tables["Ordini"].Columns.Add(dc);

    dc = new DataColumn("Data", Type.GetType("System.DateTime"));
    dc.ColumnMapping = MappingType.Attribute;
    ds.Tables["Ordini"].Columns.Add(dc);

    dc = new DataColumn("IDDettaglio",
         Type.GetType("System.Int32"));
    dc.AutoIncrement = true;
    dc.AutoIncrementStep = 1;
    dc.ColumnMapping = MappingType.Hidden;
    ds.Tables["Dettagli"].Columns.Add(dc);

    dc = new DataColumn("IDOrdine", Type.GetType("System.Int32"));
    dc.ColumnMapping = MappingType.Attribute;
    ds.Tables["Dettagli"].Columns.Add(dc);

     dc = new DataColumn("Descrizione",
          Type.GetType("System.String"));
     dc.ColumnMapping = MappingType.Attribute;
     ds.Tables["Dettagli"].Columns.Add(dc);

     dc = new DataColumn("Qt", Type.GetType("System.Double"));
     dc.ColumnMapping = MappingType.Attribute;
     ds.Tables["Dettagli"].Columns.Add(dc);

     // Creiamo la relazione
     DataRelation dr = new DataRelation("Ordini_Dettagli",
     ds.Tables["Ordini"].Columns["IDOrdine"],
     ds.Tables["Dettagli"].Columns["IDordine"]);
     dr.Nested = true;
     ds.Relations.Add(dr);

      // Inserisco qualche valore
      DataRow ndr = ds.Tables["Ordini"].NewRow();
      ndr["IDOrdine"] = 1;
      ndr["Numero"] = "12/A";
      ndr["Data"] = "09/11/2010";
      ds.Tables["Ordini"].Rows.Add(ndr);

       ndr = ds.Tables["Dettagli"].NewRow();
       ndr["IDOrdine"] = 1;
       ndr["Descrizione"] = "Solvente liquido";
       ndr["Qt"] = 15.54;
       ds.Tables["Dettagli"].Rows.Add(ndr);

       ndr = ds.Tables["Dettagli"].NewRow();
       ndr["IDOrdine"] = 1;
       ndr["Descrizione"] = "Calce idrata";
       ndr["Qt"] = 14.54;
       ds.Tables["Dettagli"].Rows.Add(ndr);

       ds.WriteXml("Ordini.xml");
       ds.WriteXmlSchema("Ordini_Schema.xsd");
       ds.Dispose();

       Console.WriteLine("\n\nHo scritto il file XML
           ed il suo schema");
       Console.WriteLine("\n\nPremi un tasto per uscire...");
       Console.ReadKey();
     }
  }
}

In questo blocco di codice abbiamo creato due tabelle “Ordini” e “Dettagli” ed abbiamo inserito alcuni campi, penso si capisca bene dal codice. Tra le due tabelle abbiamo creato una relazione e poi abbiamo inserito alcuni valori. Da notare che sulle colonne viene impostato il ColumnMapping di tipo Attribute, questo significa in caso di salvataggio in XML i campi relativi alle colonne si trasformeranno in attributi degli elementi nidificati. La relazione viene impostata a Nested che ci permette di indicare al DataSet che in caso di serializzazione in XML le righe della tabella Dettagli diventano elementi nidificati di Ordini. Al termine salviamo il tutto in un file XML ed in uno dello schema. Nei prossimi articoli su ADO.NET vedremo come inviare questi dati ad un data provider.

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.