Announcement

Collapse
No announcement yet.

Daten als XML-File ablegen, lesen und hinzufügen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    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...
    Dann hast du also schon ein fertiges Dataset in Richtung DB? Das wäre eine nicht ganz unwichtige Info.

    Comment


    • #17
      Indirekt...

      Das ist dann doch etwas komplizierter mit den Daten der Datenbank....

      Ich habe hier nur für Beispielzwecke Name, Vorname usw. benutzt.

      Der insert geht dann über mehrere Tabellen...

      Comment


      • #18
        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


        • #19
          Die frage ist, ob das so Sinn macht, oder ob das nicht doch besser geht...?
          Das macht wohl eher so keinen Sinn. 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?

          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


          • #20
            Originally posted by M Merlin
            Jetzt fehlt mir nur noch das hinzufügen von Datensätzen...
            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.

            (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 Jansen
            Aber du hast die Frage nicht beantwortet. Hast du jetzt ein ADO.NET Dataset
            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?

            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


            • #21
              @Ralf:
              Viel zu aufwendig wenn das Framework das schon automatisch kann.
              Du spricht von automatisch... dann gib doch mal nen BeispeilCode...

              Aber du hast die Frage nicht beantwortet. Hast du jetzt ein ADO.NET Dataset oder machst du das Richtung Datenbank anders?
              Ich mache das wie folgt:
              [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.
              Wie würde ich in solchem Fall das Hinzufügen realisieren ...?


              @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.
              Ja will ich... Wie gesagt. Dies ist nur ein Beispiel im Projekt geht es um andere Daten....

              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?
              Habe ich...
              ...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


              • #22
                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.
                Erzeuge also eine weitere Datei mit dem Namen Personen.Code.vb, dem gleichen Namespace und dem Inhalt public partial class dsPersonen. Achtung: imports muss auch den eigenen Namespace erwähnen.

                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


                • #23
                  Du spricht von automatisch... dann gib doch mal nen BeispeilCode...
                  im Moment wird hier immer sehr theoretisch gesprochen.
                  Es gibt eine handvoll Verfahren wie man mit Daten in einer Datenbank umgeht und lokal vorhält und für jede gibt es eine relative einfache automatische Möglichkeit Daten auf der Platte zu persistieren.

                  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


                  • #24
                    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 fragte mich wie ich die Daten in die Datenbank bekomme, das war meine Antwort darauf.... warum passt das nicht dahin....?????


                    @Ralf
                    Solange wir nicht wissen was du in etwa hast sehe ich nicht ein für jede Möglichkeit Beispiele zu liefern
                    Ich hatte schon erklärt.... Ich habe einzelne Datensätze die einzeln zu Datenbank geschrieben werden. Mit einem Insert. Beinhaltet vorher verschiedene Validierungen...
                    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


                    • #25
                      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...?
                      Da haben wir wohl wirklich alle aneinander vorbeigeredet (auch wenn Ralf und ich nicht soweit auseinander waren - glaube ich jedenfalls).

                      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...
                      Tja, es hängt eben vom Ziel und Vorgehen ab. Außerdem: Wenn Du für die DB-Anbindung einen TableAdapter (oder auch "nur" ein typ. DataSet) benutzt, dann bekommst Du eine Riesenmenge an Code mit vielen verschachtelten Klassen. Dieser Code ist erst recht unübersichtlich (aber den schreibst Du nicht selbst, sondern lässt ihn - schreibfaul wie alle Programmierer nunmal sind - von der IDE erstellen). Ob das zum Verständnis beiträgt, wage ich sehr zu bezweifeln. Es hilft vor allem, schnell "irgendein" Ergebnis zu bekommen.

                      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

                      Working...
                      X