vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

ADO.NET / Datenbanken
Dataset.XMLWriter - Erzeugte XML enthält nur den DatasetNamen 
Autor: Schudi
Datum: 12.06.18 07:55

Bitte nicht lachen. Ist vermutlich eine selten dämliche Frage, aber bei mir hakt es heute Morgen gewaltig...

Ich habe folgenden Code:
        Dim _DSKunden As New DataSet("Kundendaten")
        Dim _DTKunden As New DataTable("Kunden")
 
        With _DTKunden.Columns
            .Add("KundenNr", Type.GetType("System.String"))
            .Add("Kundenname", Type.GetType("System.String"))
            .Add("Kundenlogin", Type.GetType("System.String"))
            .Add("KundenPw", Type.GetType("System.String"))
        End With
 
        _DSKunden.Tables.Add("_DTKunden")
 
        'Nur für Test
        Dim _myRow As DataRow
        _myRow = _DTKunden.NewRow
        _myRow("Kundennr") = "100"
        _myRow("Kundenname") = "Max Mustermann"
        _myRow("Kundenlogin") = "ABCDEFGH"
        _myRow("KundenPw") = "123456"
        _DTKunden.Rows.Add(_myRow)
 
        _DTKunden.AcceptChanges()
        _DSKunden.AcceptChanges()
 
        DgvKunden.DataSource = _DTKunden
        DgvKunden.Refresh()
        DgvKunden.Show()
 
        Dim _KundenPfad As String = Path.Combine(My.Settings.Ordner_IniDatei, _
          "Kunden.xml")
        Dim _KundenXMLStream As New System.IO.FileStream(_KundenPfad, _
        System.IO.FileMode.Create)
        Dim _KundenXMLWriter As New System.Xml.XmlTextWriter(_KundenXMLStream, _
        System.Text.Encoding.Unicode)
        _DSKunden.WriteXml(_KundenXMLWriter)
        _KundenXMLWriter.Close()
Im DataGridView sehe ich erwartungsgemäß die Überschriften und den Testdatensatz. Daher gehe ich davon aus, dass die Daten korrekt in der DataTable stehen.

Eigentlich hätte ich erwartet, dass der Testdatensatz auch in der XML-Datei steht. Dem ist aber nicht so. Folgende XML-Datei wird erzeugt:

<Kundendaten />
Ich bin absolut ratlos warum der Datensatz, respektive die komplette DataTable, nicht ausgegeben wird.

Versuche ich direkt _DTKunden.WriteXML und _DTKunden.ReadXML zu verwenden, kommt es zu der Fehlermeldung:
System.InvalidOperationExecption: "DataTable untestützt keine Schemareduktion von XML". Dafür stehen die Testdaten dann aber "sauber" in der XML-Datei drin.

Wo liegt mein Denkfehler?

Ich danke schon jetzt für Eure Hilfe!

P.S.: Ich könnte die Daten statt in eine XML natürlich in eine SQLCe oder alternative DB schreiben, aber das Programm soll bewusst einfach gehalten werden und es werden voraussichtlich nicht mehr als 10 Datensätze gespeichert. Daher der Ansatz mit XML.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dataset.XMLWriter - Erzeugte XML enthält nur den DatasetNamen 
Autor: Manfred X
Datum: 12.06.18 09:26

Hallo!

Beim Aufruf der WriteXML-Methode des Dataset muß ein zweiter
Parameter gesetzt werden, um Daten und Schema zu schreiben:
XmlWriteMode.WriteSchema
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dataset.XMLWriter - Erzeugte XML enthält nur den DatasetNamen 
Autor: Schudi
Datum: 12.06.18 09:49

Vielen Dank für die Antwort.

Ich beziehe mich auf folgendes Beispiel aus der msdn:
https://msdn.microsoft.com/de-de/library/cf2bk29a(v=vs.110).aspx

Dort wird, wenn ich das recht sehe, das Schema auch nicht mit einem separaten Parameter ausgegeben...


Private Sub WriteXmlToFile(thisDataSet As DataSet)
    If thisDataSet Is Nothing Then
        Return
    End If
 
    ' Create a file name to write to.
    Dim filename As String = "XmlDoc.xml"
 
    ' Create the FileStream to write with.
    Dim stream As New System.IO.FileStream _
       (filename, System.IO.FileMode.Create)
 
    ' Create an XmlTextWriter with the fileStream.
    Dim xmlWriter As New System.Xml.XmlTextWriter _
       (stream, System.Text.Encoding.Unicode)
 
    ' Write to the file with the WriteXml method.
    thisDataSet.WriteXml(xmlWriter)
    xmlWriter.Close()
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dataset.XMLWriter - Erzeugte XML enthält nur den DatasetNamen 
Autor: Manfred X
Datum: 12.06.18 09:51

Diese Zeile im Code ist zu korrigieren:
_DSKunden.Tables.Add(_DTKunden)

Du fügst die Tabelle nicht in das Dataset ein.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dataset.XMLWriter - Erzeugte XML enthält nur den DatasetNamen 
Autor: Schudi
Datum: 12.06.18 10:04

Klasse! Vielen Dank!

Das war es! Die Anführungszeichen um "_DTKunden" waren falsch.

Jetzt stehen die Daten korrekt in der XML-Datei drin.

-

Allerdings kommt beim Einlesen noch nichts zurück. Das angezeigte DGV ist leer.

          _DSKunden.ReadXml(_KundenPfad)
 
            DgvKunden.DataSource = _DTKunden
            DgvKunden.Refresh()
            DgvKunden.Show()
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Dataset ReadXML 
Autor: Manfred X
Datum: 12.06.18 10:12

Hallo!

Ich weiß nicht, was genau Du programmierst.
So funktioniert es:
Dim _dskunden2 As New DataSet 'neues leeres Datset
_dskunden2.ReadXml(_KundenPfad) 'XML-Datei gemäß Kundenpfad lesen
 
'Tabelle per Name direkt aus Tables-Auflistung des gefüllten Dataset binden
dgvKunden.DataSource = _dskunden2.Tables("Kunden")
'oder:
_dtKunden = _dskunden2.Tables("Kunden") 'Referenzvariable zuweisen
dgvKunden.DataSource = _dtKunden 'Tabelle an Datagridview binden


Beitrag wurde zuletzt am 12.06.18 um 10:33:20 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dataset ReadXML 
Autor: Schudi
Datum: 12.06.18 11:36

Abermals vielen Dank!

Dim _dskunden2 As New DataSet 'neues leeres Datset
_dskunden2.ReadXml(_KundenPfad) 'XML-Datei gemäß Kundenpfad lesen
 
'Tabelle per Name direkt aus Tables-Auflistung des gefüllten Dataset binden
dgvKunden.DataSource = _dskunden2.Tables("Kunden")
Funktioniert bestens.

Dim _dskunden2 As New DataSet 'neues leeres Datset
 
Dim _dtkunden2 As New DataTable("Kunden") 'neue leere Tabelle "Kunden" erzeugen
 
_dskunden2.Tables.Add(_dtkunden2) 'Tabelle "Kunden" an das Dataset knüpfen
 
_dskunden2.ReadXml(_KundenPfad) 'XML-Datei gemäß Kundenpfad lesen
 
dgvKunden.DataSource = _dtkunden2
Funktioniert hingegen nicht, obwohl es doch eigentlich auf dasselbe raus kommt, oder?

Letztlich bin ich froh, dass das Programm tut, was es soll. Trotzdem würde ich gerne noch den Unterschied verstehen bzw. verstehen warum der untere Code ein leeres DGV ohne Header und ohne Daten erzeugt.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dataset ReadXML 
Autor: Manfred X
Datum: 12.06.18 12:04

Was geschieht in Deinem Code?
Gehen wir es mal zeilenweise durch ....

Dim _dskunden2 As New DataSet 
'Eine Referenzvariable zu einem Dataset wird erstellt (_dskunden2)
'Ein Dataset-Objekt wird im Speicher erstellt (New)
'Die Referenzvariable verweist auf das neue Dataset
 
 
Dim _dtkunden2 As New DataTable("Kunden") 
'Eine Referenzvariable zu einer Datatable wird erstellt (_dtkunden2)
'Ein DataTable-Objekt wird im Speicher erstellt (New)
'Die Referenzvariable verweist auf die neue Datatable
 
 
_dskunden2.Tables.Add(_dtkunden2)
'Der Tables-Auflistung des Dataset wird eine Referenz
'auf das Datatable-Objekt hinzugefügt, das unter dtKunden2
'erstellt worden ist 
 
 
_dskunden2.ReadXml(_KundenPfad)
'Die Methode ReaXML erzeugt aus dem File im Kundenpfad (Schema und Daten)
'ein NEUES Datatable-Objekt und fügt eine Referenz der 
'Dataset-Auflistung hinzu (Dataset-Inhalt ist zuvor gelöscht worden).
'Der Tabellen-Name dieses neuen Objekts entspricht dem Namen, der
'beim Schreiben eingetragen war, dessen Spalten-Objekte werden gemäß
'dem Schema, dessen Zeilenobjekte gemäß den Daten erstellt (wie geschrieben).
 
 
dgvKunden.DataSource = _dtkunden2
'Die Referenzvariable dtKunden2 zeigt immer noch auf das leere
'Datatable-Objekt, das in der zweiten Zeile erstellt worden ist.
'Im Grid wird nichts angezeigt.
 
'Ergänzung:
_dtKunden2 = _dsKunden2.Tables("Kunden")
'Jetzt zeigt die Referenzvariable auf die gelesene Tabelle "Kunden"
'(Objekt im Speicher)
'Das zuerst erstellte Datatable-Objekt verliert seine letzte Referenz,
'wird freigegeben und danach zerstört.


Beitrag wurde zuletzt am 12.06.18 um 12:18:10 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

gelöst: Dataset ReadXML 
Autor: Schudi
Datum: 12.06.18 12:23

Vielen Dank für diese tolle und detaillierte Erklärung. Jetzt habe ich verstanden, wo der Fehler lag.

'Die Methode ReaXML erzeugt aus dem File im Kundenpfad (Schema und Daten)
'ein NEUES Datatable-Objekt und fügt eine Referenz der 
'Dataset-Auflistung hinzu
Mein Denkfehler war, dass ich davon ausgegangen bin, dass ReadXML die im Dataset bereits vorhandene DataTable verwendet, da diese ja vom Namen her "passt". Somit habe ich die leer angelegte DataTable und nicht die vom ReadXML erzeugte angezeigt.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel