Also eigentlich werden die Daten in eine Datenbank gespeichert. Ich muss aber davon ausgehen das die Datenbank mal nicht erreichbar ist. Dann speichere ich die Daten lokal, ist die Datei wieder erreichbar werden die Daten dann zu Datenbank geschickt...
Announcement
Collapse
No announcement yet.
Daten als XML-File ablegen, lesen und hinzufügen
Collapse
X
-
Ich habe mir hier was gestrickt...
Eigentlich sehr einfach gehalten....
Schreiben:
[highlight=vbnet]
Dim MyWriter As System.Xml.XmlWriter
Dim MySettings As New System.Xml.XmlWriterSettings
MySettings.Indent = True
MyWriter = System.Xml.XmlWriter.Create(Application.StartupPat h & IO.Path.DirectorySeparatorChar & "Personen.xml", MySettings)
With MyWriter
.WriteStartDocument()
.WriteStartElement("Personen")
'##############################
' hier mit for each alle Peronen eintragen
.WriteStartElement("Person")
.WriteElementString("Name", "Wurst")
.WriteElementString("Vorname", "Hans")
.WriteElementString("Geburtstag", "10.10.1964")
.WriteEndElement()
'##############################
.WriteStartElement("Person")
.WriteElementString("Name", "Panzer")
.WriteElementString("Vorname", "Paul")
.WriteElementString("Geburtstag", "01.01.1988")
'.WriteEndAttribute()
.WriteEndElement()
.WriteEndElement()
.WriteEndDocument()
.Close()
End With
[/highlight]
lesen:
[highlight=vbnet]
Dim MyReader As System.Xml.XmlTextReader
MyReader = New System.Xml.XmlTextReader(Application.StartupPath & IO.Path.DirectorySeparatorChar & "Personen.xml")
With MyReader
.WhitespaceHandling = System.Xml.WhitespaceHandling.None
.Read()
.Read()
While Not .EOF
.Read()
If Not .IsStartElement() Then
Exit While
End If
.Read()
Dim MyName As String = .ReadElementString("Name")
Dim MyFirstName As String = .ReadElementString("Vorname")
Dim MyBirthday As String = .ReadElementString("Geburtstag")
Me.ListBox1.Items.Add("N= " & MyName & vbTab & "V= " & MyFirstName & vbTab & "G= " & MyBirthday)
End While
.Close()
End With
[/highlight]
Jetzt fehlt mir nur noch das hinzufügen von Datensätzen...
Die frage ist, ob das so Sinn macht, oder ob das nicht doch besser geht...?
Comment
-
Die frage ist, ob das so Sinn macht, oder ob das nicht doch besser geht...?
Wenn du schon ein Dataset hast kannst du das einfach komplett mit WriteXML auf die Platte serialisieren. Der komplette Bearbeitungszustand des Datasets wird dabei weggeschrieben. Du kannst also später wieder deserialiseren über ReadXML und hast dann einen identischen Zustand. Diesen kannst du dann genauso Richtung Datenbank schicken als hättest du nicht serialisiert/deserialisiert.
Comment
-
Originally posted by M MerlinJetzt fehlt mir nur noch das hinzufügen von Datensätzen...
(Wenn Du die erste Version der xml-Datei gespeichert hast, siehst Du in einem beliebigen Editor deren Struktur und kannst sie auch manuell bearbeiten.)
Originally posted by Ralf JansenAber du hast die Frage nicht beantwortet. Hast du jetzt ein ADO.NET Dataset
DataSet.ReadXml, WriteXml sind doch schon fertig dabei!!!
Jürgen
@Ralf
Wenn WriteXml/ReadXml auch unter "Serialisieren" fallen, dann war das oben nur ein Missverständnis meinerseits und wir meinen genau das gleiche.
Comment
-
@Ralf:
Viel zu aufwendig wenn das Framework das schon automatisch kann.
Aber du hast die Frage nicht beantwortet. Hast du jetzt ein ADO.NET Dataset oder machst du das Richtung Datenbank anders?
[highlight=vbnet]
strSQL = "INSERT INTO ..."
NewRow = (New SqlCommand(strSQL, Cnn, MyTrans)).ExecuteNonQuery
[/highlight]
Wenn du schon ein Dataset hast .....
.... Diesen kannst du dann genauso Richtung Datenbank schicken als hättest du nicht serialisiert/deserialisiert.
@Jürgen
Willst Du wirklich alle Datensätze einzeln per Code eintragen? Das geht doch wirklich per Eingabe-Formular (die einfachste Variante ist das DataGridView) sowie ReadXml/WriteXml.
Hast Du aus der obigen xsd-Schemadatei und xsd.exe ein typisiertes DataSet erzeugt? Wenn ja, wozu probierst Du dann (überflüssigerweise) mit XmlTextReader und XmlWriter herum? Wenn nein, warum nicht?
...ich hänge diese hier mal an...
...aber mir ist nicht ganz klar wie ich damit umgehen sollte...
@alle
im Moment wird hier immer sehr theoretisch gesprochen. Ich komme da im Moment nicht so weiter. Aus diesem Grund habe ich mir die obige Lösung gebastelt, damit es etwas weiter geht....Attached Files
Comment
-
Ich hatte oben (gestern #12 um 12:21 Uhr) das Weitere Vorgehen beschrieben. Der erste Satz ist durch Personen.vb mit partial class dsPersonen erledigt. Es geht also weiter mit:
diese kannst Du mit einer eigenen vb-Datei um eigenen Code erweitern.
Nachtrag: Ich stelle gerade fest, dass in Personen.vb der Namespace fehlt. Den hast Du also bei xsd.exe als Argument vergessen. Das muss unbedingt nachgeholt werden (also xsd.exe nochmals aufrufen), sonst kann der Compiler die partial class nicht zusammenfassen.
Diese Klasse erhält eine Eigenschaft Filename, eine public-Methode Write, die this.WriteXml ausführt, und eine Methode Read, die this.ReadXml ausführt (mit der Prüfung, ob Filename existiert).
Das Formular erhält zunächst eine Deklaration auf dsPersonen. In MainForm.Load wird eine Instanz erzeugt, dann Filename festgelegt und Read aufgerufen. Dann gibt es ein DataGridView mit DataSource auf die Instanz von dsPersonen und einen Button, dessen Click ds.Write aufruft.
Das ist (zunächst einmal) alles! Alle weiteren Versuche mit XmlReader usw. kannst Du vergessen, das ist überflüssig und viel zu umständlich! Jürgen
PS. Bitte beachte auch die Richtlinien für NET-Namen, z.B. bekommen Klassen einen großen Anfangsbuchstaben.
PS2. Dein Versuch mit SqlCommand passt hier überhaupt nicht her. Das kann sich nur auf den MS-SQL Server beziehen; NewRow und ExecuteNonQuery passen überhaupt nicht zusammen. Dieser Versuch ist also völlig abwegig.
PS3. Später einmal solltest Du Dich ausführlich mit OpenBook Visual C# Kap.25 ff. (Datenverarbeitung) befassen, damit Du die richtigen Klassen richtig benutzt. Aber befasse Dich jetzt erstmal nur mit der Zusammenarbeit des DataSet und dem DataGridView (und im nächsten Schritt mit TextBoxen usw.).Zuletzt editiert von Jürgen Thomas; 22.01.2009, 11:23.
Comment
-
Du spricht von automatisch... dann gib doch mal nen BeispeilCode...im Moment wird hier immer sehr theoretisch gesprochen.
Solange wir nicht wissen was du in etwa hast sehe ich nicht ein für jede Möglichkeit Beispiele zu liefern. Sondern du bekommst eben nur allgemeine Antworten wie man das denn machen könnte wenn man diesen oder jenen Weg eingeschlagen hat.
Zur Verdeutlichung.
Am Anfang sah es so aus als würdest du auf der grünen Wiese anfangen.
Dann sah es zwischenzeitlich so aus als hättest du bereits eine Anwendung die auf Datasets basiert. Der letzte Code sieht eher so aus als hättest du alles sozusagen handgemacht per Commands.
Ich weiß aber immer noch nicht in welcher Struktur du deine Daten lokal vorhälst.
Comment
-
Erst ein Mal bin ich über jede Hilfe dankbar....
...aber Ihr geht beide einen anderen Weg. Mir ist nicht ganz klar welcher der bessere ist.... der eine Hüh... der andere Hot....
... das Hilft nicht wirklich....
@Jürgen
Mir ist noch nicht ganz klar was der Vorteil ist, wenn ich einen riesen Aufwand betreibe mit Klassen erstellen usw. was man, siehe oben, mit einigen Zeilen Code erreichen kann...
PS2. Dein Versuch mit SqlCommand passt hier überhaupt nicht her.
@Ralf
Solange wir nicht wissen was du in etwa hast sehe ich nicht ein für jede Möglichkeit Beispiele zu liefern
Ist keine Komunikation zur Datenbank möglich, sollen diese Daten in eine strukturierte Datei geschrieben werden. Ist die Komunikation wieder vorhanden, sollen diese Daten eingelesen werden und die Routine zur Datenbank soll wieder anlaufen. Per Validierung und Insert...
Ich denke das gibt das Problem ziemlich genau wieder. Was wird da noch benötigt...?
Comment
-
Originally posted by M Merlin View Post...aber Ihr geht beide einen anderen Weg. Mir ist nicht ganz klar welcher der bessere ist.... der eine Hüh... der andere Hot....
... das Hilft nicht wirklich....
Ist keine Komunikation zur Datenbank möglich, sollen diese Daten in eine strukturierte Datei geschrieben werden. Ist die Komunikation wieder vorhanden, sollen diese Daten eingelesen werden und die Routine zur Datenbank soll wieder anlaufen. Per Validierung und Insert...
Ich denke das gibt das Problem ziemlich genau wieder. Was wird da noch benötigt...?
Mein Ausgangspunkt war Deine Frage: "Daten als XML-File ablegen, lesen und hinzufügen"; dazu hattest Du Deine Struktur mit den Basisfeldern angedeutet. Damit hatte ich angenommen, dass Du einen einfachen DB-Ersatz mit Xml haben wolltest, und habe einen Weg vorgeschlagen, wie Du dahin kommst. Das kannst Du offensichtlich überwiegend vergessen (wobei es zum Verständnis beitragen würde, wenn Du es nachvollziehen wolltest).
Neuer Vorschlag: Erstelle eine DB-Anbindung mit (typisiertem) DataSet und DbDataAdapter - genauso wie im OpenBook VB Kap.26 beschrieben ist - zunächst ohne überhaupt auf die "Xml-Anforderung" zu achten. Genauer (denn damit hast Du anscheinend schon begonnen): Kümmere Dich zunächst nur um alles, was damit zusammenhängt.
Erst wenn insoweit alles fertig ist, brauchst Du als Zusatzmaßnahme nur WriteXml (sofern die DbConnection nicht vorhanden ist) und ReadXml (wenn die lokale Datei vorhanden ist und eingelesen werden soll). Diese Aufgaben gehören in Deinen Teil des typisierten DataSet bzw. TableAdapter, wie in #22 beschrieben.
Mir ist noch nicht ganz klar was der Vorteil ist, wenn ich einen riesen Aufwand betreibe mit Klassen erstellen usw. was man, siehe oben, mit einigen Zeilen Code erreichen kann...
Bitte lies Dir bei Gelegenheit nochmals alles in Ruhe durch. Auch wenn Du mit meiner Hilfe nicht weitergekommen bist, bilde ich mir ein, dass ich Vernünftiges gesagt habe.
Gruß Jürgen
Comment
Comment