Laden...

Umstieg von access zu xml, nur wie?

Erstellt von ayrtonsenna vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.457 Views
ayrtonsenna Themenstarter:in
27 Beiträge seit 2006
vor 18 Jahren
Umstieg von access zu xml, nur wie?

Hallo,
ich hab da eine App, die sich die Daten aus einer Access-DB holt.
Ich habe auch schön nach dem 3-Schicht-Prinzip gearbeitet:

  1. Anzeigeschicht
  2. Geschäftsobjekte
  3. Datenzugriff
    <stolz> 😁 </stolz>

Nun wollte ich das ganze so umbauen, dass die Daten aus XML-Files kommen, nur weis ich nicht wirklich wie das dann auszusehen hat.
Derzeit gebe ich beispielsweise im Konstruktor meiner Businessobjects die ID+Tabellenname an die Datenzugriffsklasse, bastel dort die entsprechende SQL-Anweisung und gebe die empfangenen Daten zurück.
Nun kann ich ja auf ein XML wohl nicht mit einem "SELECT * FROM ??? WHERE ..." losgehen.
Was nehme ich dazu überhaupt: XmlDocument, XmlDataDocument, XPathDocument??? <amkopfkratz>

Hat jemand einen Tip für mich, wie ich am besten vorgehe?

3.003 Beiträge seit 2006
vor 18 Jahren

Jetzt wirst du gleich merken, WIE gut das mit dem Schichtenprinzip war.

Du brauchst zwei Sachen:

a) eine allgemeingültige XML-Struktur. Denk dir was aus, wie du deine Daten gern sortiert hättest.

b) 'nen neuen Datenzugriff
-> ID und Tabellenname hast du, wir übersetzen das mal zu "objekt-id und knoten-id"
Im Prinzip liest du in deiner XML-Datei den Knoten mit zB dem Attribut "ID=knotenid" aus, und dort den untergeordneten Knoten mit der id (oder irgendeinem anderen Attribut) "objekt-id". In dem Fall würde deine XML-Struktur so aussehen:


<?xml version="1.0"?>
<rootknoten>
   <tabelle name="tabellenname">
      <datensatz id="datensatzID">
             <spalte1>wert1</spalte1>
             <spalte2>wert2</spalte2>
       </datensatz>
      <datensatz id="datensatzID2">
             <spalte1>wert1</spalte1>
             <spalte2>wert2</spalte2>
       </datensatz>
   </tabelle>
   <tabelle name="nochnetabelle">
[...]
   </tabelle>
</rootknoten>

Das ist jetzt wirklich nicht mehr viel, der erste Lohnt für die Mühe mit dem Trennen der Ausführung von den Daten.

Viel Spass 🙂.

LaTino
PS: Tipp:


SelectSingleNode("/tabelle[attribute::name='"+tabellenname+"']/datensatz[attribute::id='"+datensatzID+"']");

Noch 'n Edit: wenn du nicht genau weisst, wie du den bestimmten Knoten, der deine Daten enthält, adressieren sollst, schau mal hier:
http://de.selfhtml.org/xml/darstellung/xpathsyntax.htm

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

ayrtonsenna Themenstarter:in
27 Beiträge seit 2006
vor 18 Jahren

hi,
danke für die schnelle Antwort.
So ähnlich hatte ich mir die Strucktur auch gedacht.
Nur wie komme ich jetzt an die konkreten Daten.
Also nehmen wir dein Beispiel und ich will das Objekt mit der ID=datensatzID2

MyBusinessObj mbo = new MyBusinessObj("datensatzID2");

im Konstruktor:


MyDataXML.GetData("tabellenname", "datensatzID2")

Und was muss ich bei MyDataXML.GetData machen?
Muss ich da etwa durch alle Knoten laufen und gucken, ob das Attribut ID==datensatzID2 ???
Oder kann ich da auch so was wie Where-klausen definieren???

Ich fühle mich, als hätte ich ein Brett vorm Kopf...

3.003 Beiträge seit 2006
vor 18 Jahren

Schau mal in meinen zweiten Edit 😉.


public enum DataAccessType { Xml, Access };


private void getData(string tableName, string dataID) {
   if(this.DBType == DataAccessType.Xml) {
      XmlDocument doc = new XmlDocument();
      doc.Load(this.XmlDataBase);
      string xpath = "/tabelle[attribute::name='"+tableName+"']/datensatz[attribute::id='"+dataID+"']";
      
      XmlNode node = doc.SelectSingleNode(xpath);
      foreach(XmlNode child in node.ChildNodes)
         {
              //Werte zuweisen
          }
   }
   else {
   //Kram für access

   }

}


Die Enumeration der Übersicht wegen, so kannst du dein MyBusinessObj schnell umschalten (myBusinessObj.DBType = DataAccessType.Xml oder .Access). Der XPath zeigt auf den richtigen Knoten - fertig.
Ich übernehm jetzt keine Verantwortung für die Korrektheit der Syntax oben, aber der Weg sollte jetzt einigermassen klar werden 🙂.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

ayrtonsenna Themenstarter:in
27 Beiträge seit 2006
vor 18 Jahren

den zweiten Edit hatte ich erst später gesehen.

Die Sache mit dem DataAccessType ist sehr clever. Danke für den Tip.
Ich hab's noch nicht getestet, aber ich glaube das hilft mir weiter.
Danke