Categories: C# (sharp)

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.

Share
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Published by
Giampaolo Rossi
Tags: XML

Recent Posts

MerciGest: il gestionale di magazzino semplice e gratuito

MerciGest è il software gestionale gratuito per Windows che semplifica la gestione del magazzino: giacenze,…

3 giorni ago

Software gestionali con SQL Server: un archivio unico, accessibile ovunque

Tutti i nostri software gestionali possono essere collegati a un database SQL Server, consentendo l’accesso…

4 giorni ago

Come iniziare ad usare MerciGest in 5 minuti

MerciGest è semplice e immediato: basta scaricare e installare il programma per iniziare subito. Al…

7 giorni ago

Cos’è MerciGest e a chi serve

MerciGest è un gestionale di magazzino per Windows pensato per negozi, piccole imprese e artigiani…

1 settimana ago

Introduzione alla Standard Template Library (STL)

La Standard Template Library (STL) è una delle componenti più potenti del C++. Fornisce una…

7 mesi ago

Un Abbonamento per Tutti i Software

Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…

2 anni ago