Xml Ablgeich mit Datenbank, Änderungen erkennen und abspeichern

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Xml Ablgeich mit Datenbank, Änderungen erkennen und abspeichern

    Hi ho.

    Mein Thema ist ein wenig schwierig zusammen zu fassen, daher die etwas kryptische Bezeichnug.
    Folgendes Problem:

    1. Ich habe ein XML Datei, die ich in gewissen Intervallen runterlade. In dieser stehen Daten die ich in eine Datenbank schreibe.
    Der Aufbau ist etwa so:

    XML-Quellcode

    1. <stats>
    2. <generated>1327184584</generated>
    3. <users>
    4. <user id="6588">
    5. <name></name>
    6. <family>
    7. <name>SoundSo</name>
    8. <role>None</role>
    9. </family>
    10. ...
    11. </user>
    12. </users>
    13. <counts>
    14. <total>3369</total>
    15. <online>
    16. <now>10</now>
    17. <today>119</today>
    18. <week>206</week>
    19. </online>
    20. <registrations>
    21. <today>6</today>
    22. <week>35</week>
    23. </registrations>
    24. </counts>
    25. <families>
    26. <family id="1212"
    27. </family>
    28. <name>Famname</name>
    29. <worth>622</worth>
    30. <users>25</users>
    31. <bank>45924675</bank>
    32. <city>Philadelphia</city>
    33. <boss id="6571">DerChef</boss>
    34. <sotto id="7062">DerSotto</sotto>
    35. <consig id="6637">DerConsig</consig>
    36. </families>


    Und so Weiter.
    Diese Daten lese ich aus und schreibe Sie in eine Datenbank.
    Nun gibt es zum Beispiel zu jedem User Attribute.
    - Name, Status usw.
    Diese können sich ändern. Dafür führe ich eine Historie in der Datenbank.
    Ich habe als eine Tabelle User. Dort stehen die aktuellen Daten zu jedem User drinnen.
    Dann habe ich eine Tabelle Userhistory. Dort trage ich Änderungen ein.

    Es gibt noch mehr als Users. Zum Beispiel Families.
    User können in einer Familie seien, müssen Sie aber nicht. Familien haben allerdings nur 3 User als XMLNode.
    Die 3 Familien "Bosse".
    In der XML werden nur Online User angezeigt. Das kann bedeuten, das sich in einer Familie Änderungen in den Top3 wiederfinden, die ich nur dort lesen kann, und dann natürlich auch in die Userhistory müssen.

    So.
    Ich habe das ganze bisher so gelöst, dass ich die XML Node für Node durchgehe und die Werte mit den Werte in der Datenbank abgleiche.
    Die Datenbank ist eine MS SQL CE Datenbank.
    Das ganze habe ich schon vor einer ganzen Weile gemacht. Die Datenbank Zugriffe geschehen über SQLCE Reader usw.
    D.h. ich schreibe die Abfragen im Code mit den XML Werten als Parametern.

    Ich möchte das ganze nun komplett überarbeiten, da mir zum einen die Herangehensweise nicht gefällt, und mir auch die Übersichtlichkeit fehlt, wie ich jetzt merke.
    (Habe mir dieses Projekt schon ewig nicht mehr angeschaut gehabt)

    Hat jemand prinzipiell eine Idee, wie ich da besser herangehe als über SQLCE Reader und durch alle Nodes laufen und immer Abfragen im Code schreiben?
    Mit anderen Worten, wie vergleiche ich am besten XML Daten mit Daten in einer Datenbank +
    wie schreibe ich am besten Änderungen, falls welche existieren in die Datenbank, ohne mir die Abfragen aus Strings und XML Element zusammenzubasteln?
    Ich habe im Moment ein bissl ein Grundkonzept Problem.

    Was zum Beispiel nicht funktioniert:

    VB.NET-Quellcode

    1. Dim ds As New DataSet
    2. ds.ReadXml(xmlFile)


    Sprich die XML Files direkt in ein Dataset zu laden und damit zu hantieren.
    Grund dafür ist, das jeder User einen SubNode Family hat, welcher weitere Subnodes hat.
    Es gibt aber einen weiteren komlpetten Node Family.



    Ich hoffe ich habe mich verständlich ausgedrückt.

    Cheers Mono
    Das ist meine Signatur und sie wird wunderbar sein!

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

    Mono schrieb:

    Hat jemand prinzipiell eine Idee, wie ich da besser herangehe als über SQLCE Reader und durch alle Nodes laufen und immer Abfragen im Code schreiben?

    Das wird immer relativ wurstelig bleiben.
    Du hast halt 2 Quellen in inkompatiblem Format, die du miteinander abgleichen willst.

    Ich denke natürlich gleich an ein typisiertes Dataset, wo du die Xml reinlädst, und weil .ReadXml ausscheidet, musses halt über einen wursteligen Konverter-Code erfolgen.
    Immerhin die SqlCe-Daten kann man auf performante Weise in zusätzlich anzulegende DataTables laden, und hat damit eine ordentliche Basis für die weitere Verarbeitung.

    Man muß auch wohl genau überlegen, welche Daten ühaupt zu laden sind - die komplette History wird wohl nicht nötig sein, oder?
    Nein, es reicht die jeweiligen aktuellen Daten zu laden.
    Nur Änderungen werden in der Userhistory benötigt.

    Typisiertes Dataset war auch mein Gedanke, nur bin ich mir noch nicht im klaren, wie ich diese dann geschickt vergleiche, history Daten update und Events feuere.
    Grundsätzlich würdest du also die zu vergleichenden SQL Daten in ein Dataset laden, die XML "händisch" in ein Dataset wursteln und dann die Datasets vergleichen?
    Das ganze muss alle paar Minuten geschehen, würdest du die SQL Daten komplett im Dataset halten und nur History Daten direkt in die Datenbank schreiben?
    Und wie vergleiche ich die Daten dann am besten?

    Danke für jede Idee ^^
    Das ist meine Signatur und sie wird wunderbar sein!
    Grundsätzlich würdest du also die zu vergleichenden SQL Daten in ein Dataset laden, die XML "händisch" in ein Dataset wursteln und dann die Datasets vergleichen?
    ich würde beides in dasselbe Dataset laden, in verschiedene Tabellen.

    Mono schrieb:

    Und wie vergleiche ich die Daten dann am besten?

    Das kommt auf die Daten an.