DataSets und XML-Schemas
Zu Abschnitt 5.5.2 des Buchs
Das folgende Beispiel zeigt die unterschiedlichen Möglichkeiten
für das Lesen von Daten und Schemainformation aus XML-Dateien
und wie diese Daten in ein DataSet übernommen werden können.
Es wird dabei ein DataSet, das aus einer Datenbank aufgebaut wurde, mit Schema und
Daten aus XML-Dateien kombiniert. Dazu werden folgende XML-Dateien verwendet:
Es werden nun die folgenden drei Methoden getestet.
- Methode 1: Mit
ReadXml wird versucht, sowohl die Daten als auch das Schema aus der
Datei personMailDataAndSchema.xml zu lesen und ins DateSet aufzunehmen.
- Methode 2: Mit
InferXmlSchema wird aus dem reinem Datenfile
personMailData.xml das Schema ermittelt und mit dem bestehenden Schema
des DataSets kombiniert.
- Methode 3: In dieser Variante wird zuerst mit
ReadXml Schema und Daten aus
der Datei personMailDataAndSchema.xml in ein neues, leeres
DataSet (d2 ) gelesen. Danach wird dieses DataSet mit dem ursprünglichen DataSet mit Merge
kombiniert.
Das folgende Programm verwendet die zwei Utility-Klassen
DBReader und DataSetPrinter.
5-5-2-ReadAndInferXmlSchemaSample.cs
using System;
using System.Data;
using System.Data.OleDb;
using System.Xml;
namespace Chapter5
{
public class ReadAndInferXmlSchemaSample
{
public static void Main()
{
Console.WriteLine("\n Beispiel zu XmlDaten und Schema mischen!");
Console.WriteLine(" Daten aus DB laden: \n ");
DataSet ds = DBReader.LoadDataFromDB();
DataSetPrinter.Print(ds.Tables["Person"]);
SchemaDemo(ds, "personMailData.xml", "personMailDataAndSchema.xml");
}
//liest die Daten aus der XML-Datei und fuegt sie dem DataSet hinzu
static void SchemaDemo(DataSet ds, string dataFile, string dataAndSchemaFile)
{
try
{
Console.WriteLine("\n METHODE 1: ds.ReadXml(\"{0}\", XmlReadMode.InferSchema); ergibt:\n", dataFile);
ds.ReadXml(dataAndSchemaFile, XmlReadMode.InferSchema);
DataSetPrinter.Print(ds.Tables["Person"]);
}
catch (Exception e)
{
Console.WriteLine("ERROR : {0}", e.Message);
}
ds.RejectChanges();
Console.WriteLine("\n METHODE 2: ds.InferXmlSchema(\"{0}\", ...); ergibt:\n ", dataFile);
ds.InferXmlSchema(dataFile, new string[0]);
DataSetPrinter.Print(ds.Tables["Person"]);
ds.RejectChanges();
Console.WriteLine("\n METHODE 3: ds2.ReadXml + ds.Merge: \n");
DataSet ds2 = new DataSet();
ds2.ReadXml(dataAndSchemaFile); //einthaltenes XML Schema wird automtisch verwendet
Console.WriteLine(" 3.1) ds2.ReadXml(\"{0}\"); ergibt:\n", dataFile);
DataSetPrinter.Print(ds2);
ds.Merge(ds2); //DataTable "Person" aus ds und ds2 haben ID als Schluessel
Console.WriteLine(" 3.2) ds.Merge(ds2) ergibt: \n");
DataSetPrinter.Print(ds.Tables["Person"]);
ds.RejectChanges();
}
}
}
|
Die folgende Ausgabe zeigt die Ergebnisse:
- Die erste Ausgabe zeigt den Inhalt des ursprünglichen DataSets, wie es aus der Datenbank gelesen wurde.
- Die zweite Ausgabe zeigt das Ergebnis bei Anwendung von Methode 1:
Dadurch dass die Spalte ID aber als Primärschlüssel definiert wurde,
kommt es zu einem Konflikt und es wird eine Exception geworfen.
- Die nächste Ausgabe zeigt, dass bei Methode 2 nur das Schema um die Spalte Email erweitert wurde.
- Die Ausgabe für Methode 3 zeigt uns, dass diese Methode das richtige Ergebnis liefert.
Durch die Kombination der Daten mit der Methode
Merge werden die Daten so zusammengeführt,
wie wir das erwarten.
|