| |
ADO.NET / DatenbankenDataset.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. | |
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 | |
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 | |
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. | |
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() | |
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. | |
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. | |
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. | |
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. | |
| 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 |
|
|
Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
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
|
|