Laden...

[gelöst] DataTable speichern

Erstellt von Taladan vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.268 Views
Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren
[gelöst] DataTable speichern

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:

  1. Wie lese ich die Dateien aus?
  2. Wie schreibe ich die Dateien?

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

365 Beiträge seit 2007
vor 15 Jahren

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.

3.825 Beiträge seit 2006
vor 15 Jahren

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

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren

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

Gelöschter Account
vor 15 Jahren

wo liegt das problem? dann specher halt nur gewisse daten.. du kannst auch manuell alles in eine datei ala csv schreiben oder selber eine xml struktur erzeugen....

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren

Ich weiß nicht wie ich die daten vernünftig trennen kann, ohne aufwendige prozeduren zu schreiben.

Gruß dat Tala

Gelöschter Account
vor 15 Jahren

naja aber pauschal können wir hier keine vernünftige lösung bieten.

U
237 Beiträge seit 2007
vor 15 Jahren

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

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren

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

Gelöschter Account
vor 15 Jahren

So weit war ich auch schon, doch scheitert es an der Ausführung.

	[Wichtig: [Hinweis] Wie poste ich richtig? ](http://www.mycsharp.de/wbb2/thread.php?threadid=26594)  
		Punkt 5 Problem genau beschreiben, inkl. genauer Fehlermeldung
U
237 Beiträge seit 2007
vor 15 Jahren

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

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren

Und zwar genau Hier



NewTable.ReadXmlSchema(ms);


Gruß dat Tala

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren

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

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren

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

U
237 Beiträge seit 2007
vor 15 Jahren

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

103 Beiträge seit 2006
vor 15 Jahren

Generelle Frage:

Ist die BeginLoadData() und EndLoadData() - Geschichte sinnvoll?

OUT! OUT! You demons of stupidity!
-Dogbert

Taladan Themenstarter:in
582 Beiträge seit 2008
vor 15 Jahren

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