DataSet.DataTable.Current export in XML

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von DianonForce.

    DataSet.DataTable.Current export in XML

    Hi, muß schon wieder ein Frage stellen, aber bevor ich das Rad neu erfinde, lieber so.

    Gibt es eine Eine einfache Methode die aktuelle Zeile einer Tabelle in eine XML zu exportieren? Also nicht die ganze Tabelle und auch nicht das komplette DataSet, sondern nur eine einzige Zeile. Ich benötige dies füe eine Übergabe an ein 3th Party Programm.

    Momentan passiert dies aus einer Access Anwendung herraus, indem ein Recordset erstellt wird und dies mit

    Quellcode

    1. Application.ExportXML
    als XML gespeichert wird. Und jetzt kommt der Punkt an dem vermutlich alle den Kopf schütteln und weglaufen - diese XML wird importiert und zwar nicht so wie man es erwarten würde, die Fremdanwendung liest nicht die Nodes aus, sondern es werden wohl fest deffinierte Zeilen der XML ausgelesen. D.h. die erzeugte XML sollte der aus Access möglichst entsprechen.

    Ich hab jede menge Ansätze gefunden, wie ganze Datasets oder DataTable in XML exportiert werden können, aber eine einzelen Row scheint kompliziert zu sein, oder ich hab noch nicht nach dem richtigen gesucht.
    @DianonForce Du kannst den Datensatz, der die Zeile beschreibt, per serialisierbarer Klasse xml-serialisieren:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Daten in eine Datei schreiben
    3. ''' </summary>
    4. ''' <param name="data">die zu speichernde Instanz</param>
    5. ''' <param name="file">Dateiname</param>
    6. Public Sub WriteData(data As MyData, file As String)
    7. ' Serialize object to a XML file.
    8. Using sw As New StreamWriter(file, False, Encoding.Default)
    9. Dim x As New XmlSerializer(data.[GetType]())
    10. x.Serialize(sw, data)
    11. End Using
    12. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich hab nochnie davon gehört, dass jmd eine einzelne Datarow als Xml exportieren möchte.
    Was vorbereitetes dafür ist mir nicht bekannt.
    Ansonsten kanns nicht weiter schwer sein, solch selbst zu machen, aber es gibt unendlich viele Möglichkeiten das umzusetzen.
    Um nu den Anforderungen deines 3-Party zu entsprechen müsste man erstmal ein paar Beispiele zu gesicht bekommen, die von dem akzeptiert würden.
    Ja, das man nur eine Row exportiert ist sicher nicht alltäglich, aber anders kann ich das Fremdprogramm von 1980 nicht dazu bringen, von einem Ticket einen Auftrag zu generieren und den brauch ich wiederrum für Lieferschein und Lagerbewegung, ... .
    Da das Fremdprogramm nur definierte Positionen ausliest, wäre vermutlich auch jede andere Textdatei möglich, aber das wurde vor 5 Jahren extra für uns angepasst, dass es hald die XML aus Access frist. Und nein, eine Anpassung des 40 Jahre alten Programms ist für leider keine Option (Anweisung von oben) :( .

    Ich werd den Vorschlag mal ausprobieren, in die Richtung hatte ich auch selbst schonn vermutet, aber ich dachte ich frag, bevor ich später feststelle es hätte was einfacheres gegeben.
    Bist du in Xml gut zu Fuss?
    Sonst wie gesagt häng mal eine Beispiel-Xml an, und die xsd deines Datasets, und sag, aus welcher Tabelle die xml zu generieren ist.

    Auch wenn die Rahmenbedingungen hinreichend definiert sind, gibts immer noch mehrere Möglichkeiten, und kommt auf die Xml-Struktur an, was am Ende am elegantesten ist.
    Hmm - diese Tabelle deckt sich nur teilweise mit dem, was in der Beispiel-Xml an Einträgen auftaucht:

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2018-08-06T13:01:55">
    3. <abf_tbl_serviceticket_last>
    4. <ID>61930</ID>
    5. <Datum>2018-08-06T13:01:55</Datum>
    6. <geraetenr>021061385</geraetenr>
    7. <Ansprechpartner>Frau Soundso</Ansprechpartner>
    8. <bestellnr></bestellnr>
    9. <Stoerung>Beauftragte Dienstleistung: sonstiges Klappe Rechts lässt sich nicht schließen, </Stoerung>
    10. <terminTyp>99</terminTyp>
    11. <Status>10</Status>
    12. <Techniker>%</Techniker>
    13. <annahmedurch>jw</annahmedurch>
    14. <adressid>9482</adressid>
    15. <Firma>Irgend ein Kunde</Firma>
    16. <Strasse>Irgend eine Landstrasse 2</Strasse>
    17. <Ort>Somewhere</Ort>
    18. <Plz>45678</Plz>
    19. <Standort>Oben / Unten / rechts / links</Standort>
    20. <Modell>O3350</Modell>
    21. <Auftragtkd></Auftragtkd>
    22. <wvt>7</wvt>
    23. <fleet></fleet>
    24. <telnummer>0123467895</telnummer>
    25. <rep_status></rep_status>
    26. </abf_tbl_serviceticket_last>
    27. </dataroot>
    Na, ok - ich nehme nun an, die Regel ist: ID und Datum sind hinzugeneriert, und Werte, die Null sind, werden inne Xml dann ausgelassen.
    Hmm - ich glaub das wird nicht gut gehen.
    Woher soll ich denn einen vernünftigen Wert für ID nehmen?
    Und ist Datum wirklich das Export-Datum des Datensatzes, also hier der 6.8.2018?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Entschuldigung, da ist was beim Screenshot machen schief gegangen. ID und Datum stehen natürlich auch im DS.
    Das datum wird bei der Eingabe durch den User automatisch generiert, er darf es aber überschrieben, hat also nicht direkt was mit dem Erstellungszeitpunkt des Datensatzes noch mit dem Exportzeitpunkt was zu tun.


    Und ja, Acces lässt beim XML Export die leeren Felder einfach weg.
    Ich würd ja gerne sagen, ich sei unschuldig, aber ein Teil davon ist von mir. Damals noch mit viel mehr Unwissen und mit Vorgaben von oben. Von letzterem kommen die ollen präfixe der Tabellen und auch die komischen Underscores kommen von da. Die wirre Groß/Kleinschreibung ist auf meinem Bockmist gewachsen, schlechter bzw. garkein Stiel und dann immer mal alle 5 Monate was gemacht, sowas kommt bei rus :(
    Jo, und dann noch bei nur 4 Spalten NotNull gesetzt, und keinen PrimKey - da kannste jeden erdenklichen Müll reinkippen.
    Euer Datenbestand wird dementsprechend vermutlich ebenso abenteuerlich ausfallen, wie das Tabellen-(Nicht-)Design aussieht.

    Aber hier die Methode, zum exportieren:

    VB.NET-Quellcode

    1. Imports System.Xml.Linq, System.IO
    2. '...
    3. Private Shared Sub ExportRow(fileName$, rw As DataRow)
    4. Dim xdoc = <?xml version="1.0" encoding="UTF-8"?>
    5. <dataroot xmlns:od="urn:schemas-microsoft-com:officedata"/>
    6. Dim root = xdoc.Root
    7. root.@generated = Date.Now.ToString("s")
    8. Dim tbl = rw.Table
    9. Dim xTbl = New XElement(tbl.TableName)
    10. root.Add(xTbl)
    11. For Each clm As DataColumn In tbl.Columns
    12. If Not rw.IsNull(clm) Then
    13. Dim xClm = New XElement(clm.ColumnName)
    14. If clm.DataType Is GetType(Date) Then
    15. xClm.Add(DirectCast(rw(clm), Date).ToString("s"))
    16. Else
    17. xClm.Add(rw(clm).ToString)
    18. End If
    19. xTbl.Add(xClm)
    20. End If
    21. Next
    22. Dbg(xdoc)
    23. Dim fi = New FileInfo(fileName)
    24. If fi.Exists Then fi.Delete()
    25. xdoc.Save(fi.FullName)
    26. End Sub

    Müsste mit allen Tabellen funzen
    Vielen Dank, muss ich dann bei Gelegenheit ausporbieren, atm muß ich leider was anders machen.

    Was heißt ohne PrimaryKey? Ist durch die Screenshots vielleicht jetzt echt scheiße gewesen, aber bei ID, die erste Checkbox ist doch PK(PrimaryKey) sieht man auch aum Schlüssel am anfang der Zeile.

    Und das ich so wenig NotNull hab liegt daran, das meine User Rückendeckung von der GL für ihre Faulheit bekommen. Ich zwing sie schon im Form einiges was in der DB noch auf default NULL steht einzugeben, es ist aber laut GL schon zu viel verlangt das sie den Anrufer nach Namen und Email fragen, von der Telefonnummer ganz zu schweigen. Wobei ich sagen muss, die Nummer steht heute meistens auf dem Display des Telefons (kann man auch in der Historie nochmal nachschauen) und ein höflicher Anrufer nennt zu Beginn eines Gesprächs auch seinen Namen. Trotz allem habe ich die Tabelle voll von Namen = aaa oder Telefonnummer = 1234 und bei der Email tragen sie einfach ihre eigene ein.
    Ich weiss, du bist da härter drauf ;) , aber mir bliebe da eigendlich nur die Kündigung, zwingen hab ich versucht, erfolglos. Jetzt sind nur die Spalten auf NotNull die ich nachher zwingend in einer MobileApp brauche, damit diese nicht abschmiert. Wenn der Rest Null ist, zeigt sich hald einfach ein lleres Ticket an, das ist mir dann egal, dass muss dan derjenige, der diese Faulheit deckt dem Kunden erklären.