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

Un Abbonamento per Tutti i Software

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

10 mesi ago

Software di Magazzino Gratuito

MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→

11 mesi ago

Mettere il PC in Lock Screen

In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…

3 anni ago

Fare il reset togliendo la corrente

In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…

3 anni ago

Prossimi Aggiornamenti Software

Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…

3 anni ago

Come Eliminare i Files in Windows

Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→

3 anni ago