Home   Cover Cover Cover Cover
 

XML-Navigation bei DataSets


Zu Abschnitt 5.5.3 des Buchs

Das Beispiel zeigt wie auf DataSets mittels XML-Dokumenten zugegriffen werden kann. In der Methode UseXmlDataDocument wird für das DataSet ein XmlDataDocument erzeugt. Das XmlDataDocument hält nun die gleichen Daten wie das DataSet. Änderungen im DataSet sind unmittelbar im XmlDataDocument sichtbar.

5-5-3-XmlDataDocumentSample.cs
using System;
using System.Data;
using System.Data.OleDb; 
using System.Xml;

using Chapter5.Util;

namespace Chapter5.DS_XML
{
    public class XmlDataDocumentSample
    {

        static void Main(string[] args)
        {
            //----- Daten laden
            Console.WriteLine("\nXmlDataDocument und DataSet Beispiel!");
            DataSet ds = LoadDataFromDB();
            //----- Daten ausgeben 
            Print(ds); 

            //----- auf Daten ueber XmlDataDocument zugreifen
            UseXmlDataDocument(ds);
        }

        public static void UseXmlDataDocument(DataSet ds)
        {
            XmlDataDocument xmlDoc = new XmlDataDocument(ds); // ds enthlt Daten + Schema
            //----- Namen der Person mit ID=3 im DataSet aendern
            DataTable table = ds.Tables["Person"];
            table.Rows.Find(23)["Name"] = "Changed Name!";
            //----- Ist die nderung schon im XML-Dokument sichtbar?
            XmlElement root = xmlDoc.DocumentElement;
            XmlNode person = root.SelectSingleNode("descendant::Person[ID='23']");
            Console.WriteLine("Zugriff via XML: \n" + person.OuterXml);
            //----- XML-Dokument speichern
            xmlDoc.Save("data2.xml");
            Console.WriteLine("Anzahl der veraenderten Zeilen: {0}", table.GetChanges().Rows.Count);
        }

        static DataSet LoadDataFromDB()
        {
            //----- Connection erzeugen
            OleDbConnection conn = new OleDbConnection("provider=SQLOLEDB; " +
                " data source=(local)\\SQLEXPRESS; database=NETBOOK;" +
                "user id=sa; password=sa;");
            DataSet ds = new DataSet("PersonContacts");
            IDbDataAdapter adapter = new OleDbDataAdapter();
            //----- SELECT-Command erzeugen und setzen 
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = conn;
            cmd.CommandText = "SELECT * FROM Person; SELECT * FROM Contact";
            adapter.SelectCommand = cmd;
            //----- im DataSet befinden sich noch keine Tabellen, also fge sie bei Fill hinzu!
            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            //----- Automatisch erzeugte Tabellen umbenennen
            adapter.TableMappings.Add("Table", "Person");
            adapter.TableMappings.Add("Table1", "Contact");
            //----- Daten aus der Datenbank laden
            adapter.Fill(ds);
            if (ds.HasErrors) ds.RejectChanges(); else ds.AcceptChanges();
            if (adapter is IDisposable) ((IDisposable)adapter).Dispose();
            return ds;
        }

        static void Print(DataSet ds)
        {
            Console.WriteLine("DataSet {0}:", ds.DataSetName);
            Console.WriteLine();
            foreach (DataTable t in ds.Tables)
            {
                Print(t);
                Console.WriteLine();
            }
        }

        static void Print(DataTable t)
        {
            //---- Tabellenkopf
            Console.WriteLine("Tabelle {0}:", t.TableName);
            foreach (DataColumn col in t.Columns)
            {
                Console.Write(col.ColumnName + "|");
            }
            Console.WriteLine();
            for (int i = 0; i < 40; i++) { Console.Write("-"); }
            Console.WriteLine();

            //---- Daten
            int nrOfCols = t.Columns.Count;
            foreach (DataRow row in t.Rows)
            {
                for (int i = 0; i < nrOfCols; i++)
                {
                    Console.Write(row[i]); Console.Write("|");
                }
                Console.WriteLine();
            }
        }

    }
}

Beim Ausführen des Programms wird folgende Ausgabe erzeugt:

output