verwendetes Datenbanksystem: XML
Hallo Experten, ich zerbreche mir gerade den Kopf und komme irgendwie nicht weiter. Ich möchte gerne zwei verschiedene XML Dateien als Quelle verwenden.
Die 1 und wichtigere Datei soll die Grunddaten, als auch Hilfs- und Startdaten liefern.
Die 2 Datei soll sowohl Änderungen der Daten aus der 1, als auch hinzugefügte Datensätze speichern.
Die erste Datenbank sollte jedoch generell nicht Überschrieben werden, da über diese später auch evtl Updates geliefert werden sollen.
Jetzt stellen sich mir zwei Fragen:
Ich dachte schon, die Dateien über ein entsprechendes zusätzliches bool-Feld (in meinen Falle "UserDefinitions") zu Kennzeichnen. Doch bereitet mir das Speichern sorgen. (Ich habe keine Ahnung ob mein Ladevorgang richtig ist).
Hat jemand ne idee wie man das bestenfalls bewergstelligen kann?
Gruß dat Tala
Du sprichst im Titel von einer DataTable speichern und hinterher von Datenbanken ....
Also mehrere 🤔
DataTable.ReadXml();
DataTable.WriteXml();
Sind Methoden um deine Tabellen sofort in Xml - Dateien zu schreiben,
oder um aus Xml - Dateien wieder DataTable Objekte zu erzeugen.
Wenn Du mehrere Tabellen in einem Dataset hast kannst Du die auch auf einmal schreiben und lesen :
ds.WriteXml();
Was ist ein Dataset ? -> http://www.seven-c.de/files/datenbankenhowto.htm Kapitel "Daten ändern"
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Das sind doch die Grundbegriffe, ich ich schon seit jahren kenne. Aber es geht mir darum nur spezielle daten zu speichern. nicht alle!!!
Gruß dat Tala
Ich weiß nicht wie ich die daten vernünftig trennen kann, ohne aufwendige prozeduren zu schreiben.
Gruß dat Tala
man kann doch auf eine datatable ein select ausführen. da bekommt man dann datarow[] zurück. die rows dann in ein neues datatable packen und das per writeXML speichern.
heute code ich, morgen debug ich und übermorgen cast ich die königin auf int
So weit war ich auch schon, doch scheitert es an der Ausführung. Und zwar sagt der mir
"Das Stammelement ist nicht vorhanden." Sobald Daten in einer Tabelle ist.
foreach (DataTable dt in BigBase.Tables)
{
// Legt die Auwahl fest
string expression = "UserDefinition = true";
// Legt die Sortierung fest
string sortOrder = "ID ASC";
DataRow[] foundRows = null;
// Abfrage des filters
foundRows = dt.Select(expression, sortOrder);
DataTable NewTable = new DataTable();
System.IO.MemoryStream ms = new System.IO.MemoryStream();
dt.WriteXmlSchema("d://test");
ms.Position = 0;
NewTable.ReadXmlSchema(ms);
NewTable.Rows.Add(foundRows);
NewTable.TableName = dt.TableName;
NewTable.WriteXml(pfad + dt.TableName + ".xml");
MessageBox.Show(dt.TableName);
}
Gruß dat Tala
soweit ich das richtig in erinnerung habe, kommt diese fehlermeldung bei XML, wenn man den xml-header vergisst. also diese zeile wo coding und xml-version drinsteht.
kannst du noch sagen in welcher zeile die fehlermeldung kommt?
heute code ich, morgen debug ich und übermorgen cast ich die königin auf int
Arg Fehler meinerseits, hatte noch oben den Debugingcode gepostet. Fehlermelung lautet
Das Objekt des Typs NamensregionenRow kann nicht in Typ System.IConvertible umgewandelt werden.<Meistertools.DataSets.Namen+NamensregionenRow> konnte nicht in der ID-Spalte gespeichert werden. Erwarteter Typ: Int32.
Und erfolgt hier:
// Legt die Auwahl fest
string expression = "UserDefinition = true";
// Legt die Sortierung fest
string sortOrder = "ID ASC";
DataRow[] foundRows = null;
// Abfrage des filters
foundRows = dt.Select(expression, sortOrder);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
dt.WriteXmlSchema(ms);
ms.Position = 0;
DataTable NewTable = new DataTable();
NewTable.ReadXmlSchema(ms);
NewTable.Rows.Add(foundRows); // Hier kommt der Fehler
NewTable.TableName = dt.TableName;
NewTable.WriteXml(pfad + dt.TableName + ".xml");
Gruß dat Tala
Habs raus gefunden. Eigendlich simpel, wenn man weiß wie
foreach (DataTable dt in BigBase.Tables)
{
// Legt die Auswahl fest
string expression = "UserDefinition = true";
// Legt die Sortierung fest
string sortOrder = "ID ASC";
DataRow[] foundRows = null;
// Abfrage des filters
foundRows = dt.Select(expression, sortOrder);
// Schema kopieren auf ein neue DataTable
System.IO.MemoryStream ms = new System.IO.MemoryStream();
dt.WriteXmlSchema(ms);
ms.Position = 0;
DataTable NewTable = new DataTable();
NewTable.ReadXmlSchema(ms);
//Daten übertragen
NewTable.BeginLoadData();
foreach (DataRow copyRow in foundRows)
NewTable.ImportRow(copyRow);
NewTable.EndLoadData();
NewTable.TableName = dt.TableName;
NewTable.WriteXml(pfad + dt.TableName + ".xml");
}
Gruß dat Tala
dt.Select gibt dir ein DataRow[] zurück. dt.Rows.Add erwartet entweder eine DataRow oder ein array aus parametern für eine DataRow.
Man kann also mit Rows.Add nur eine DataRow hinzufügen. Da musst du wohl mit einer Schleife die Rows aus dem Select der neuen DataTable hinzufügen.
heute code ich, morgen debug ich und übermorgen cast ich die königin auf int
Generelle Frage:
Ist die BeginLoadData() und EndLoadData() - Geschichte sinnvoll?
OUT! OUT! You demons of stupidity!
-Dogbert
Ja. Sorgt dafür , das bestimmte ausnahmen nicht kommen. Beispiel: Du hast eine Datenverbindung (Constraint) und lädst tabellenweise deine Daten, klar das es zu ausnahmen kommen muß, da bestimmte daten (noch) nicht gelesen sind.
Zudem während der Zeit keine Events ausgelöst werden, was auch auf der Positivliste ist.
Gruß dat Tala