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:
|