datatable, columns und rows (grundsaetzliches und spezielles)



  • hallo allesamt, zunaechst zum speziellen. ich habe hier ein kleines problem mit dem dataset. ich fummel gerade an so einem tool herum, welches anhand von datanbankabfragen bestimmte excel formulare ausfuellt.

    bloederweise hat irgendwer die datenbank soweit verkackt, dass die struktur folgendermasen aussieht

    ATTRIBUT1; ATTRIBUT2 ; ATTRIBUT3 ; OMGLOL ; VALUEOFOMGLOL
    bla ; blup ; ploep ; ATTRIBUT4 ; eeh
    bla ; blup ; ploep ; ATTRIBUT5 ; ööh
    bla ; blup ; ploep ; ATTRIBUT6 ; üüh

    fuer mein tool werde ich die attribute 4-6 auf jedenfall wieder horizontal ablegen muessen. es soll also so aussehen:

    ATTRIBUT1; ATTRIBUT2 ; ATTRIBUT3 ; ATTRIBUT4 ; ATTRIBUT5 ; ATTRIBUT6
    bla ; blup ; ploep ; eeh ; ööh ; üüh

    zur zeit versuche ich den algo dafuer zu entwickeln und scheitere an dem grundsaetzlichen.

    das einlesen der daten funzt bereits. als zwischenschritt speicher ich das dataset als xml ab und oeffne es dann mit excel.
    was mir allerdings sorgen bereitet ist der umgang mit den rows und columns.

    als erstes versuche ich naemlich an die spalte OMGLOL zu kommen, sie durchzulaufen, und fuer jeden wert (also attr4-6) eine neue spalte zu erzeugen.
    code-technisch scheint es auch zu klappen (der columncount der datatable steigt):

    DataColumn newColumn=new DataColumn(pDataTable.Rows[cRowIndex].ItemArray[cColumnIndex].ToString(),System.Type.GetType("System.String"));
    pDataTable.Columns.Add(newColumn);
    

    allerdings bekomme ich komischerweise die neuen spalten in der exceltabelle nicht angezeigt?!?! ich habe mir ueberlegt ob es nicht vielleicht daran liegen koennte, dass die columns zwar da sind, aber noch keine daten enthalten und deshalb beim speichern als xml nicht mitgenommen werden.

    ist es ueberhaupt so, dass die itemarrays der rows automatisch verlaengert werden wenn man neue spalten einfuegt, oder wie genau laeuft das?
    und welchen index bekommen die neuen spalten? werden die einfach ans ende eingefügt?

    ausserdem finde ich es grundsaetzlich seltsam mit datatables zu hantieren. so eine datatable ist ja nicht bloss ein 2d-array. wenn ich nun in diese neuen spalten daten einfuegen will, ohne die der anderen spalten anzufassen, weiss ich nicht wie ich das am besten hinkriege? man kann die daten ja nur zeilenweise eintragen, und die einzelnen zellen ueber Rows[rowIndex].ItemArray[columnIndex] ansteuern.
    allerdings empfind ich es als zu aufwendig, jedes mal den index der gesuchten spalte rauszusuchen und an die entsprechende stelle den wert einzutragen. gibt es da nicht elegantere moeglichkeiten?



  • Warum fügst Du Spalten während der Laufzeit in die DataTable ein? Sind die Spalten nicht konstant (Hier bezeichnet mit ATTRIBUT1 .. ATTRIBUT6)? Dann können sie doch gleich von Anfang an mit erstellt werden.
    Was ist das für ein DBS? Hat es vernünftiges SQL? Ich würde es in diesem Fall auf SQL-Ebene lösen.
    Ist das Zeile 1?:

    bla ; blup ; ploep ; ATTRIBUT4 ; eeh
    bla ; blup ; ploep ; ATTRIBUT5 ; ööh
    bla ; blup ; ploep ; ATTRIBUT6 ; üüh
    

    Würde dann Zeile 2 so aussehen?:

    foo ; bar ; mist ; ATTRIBUT4 ; sonne
    foo ; bar ; mist ; ATTRIBUT5 ; pluto
    foo ; bar ; mist ; ATTRIBUT6 ; mars
    

    Daraus folgt:

    SELECT DISTINCT t.ATTRIBUT1,t.ATTRIBUT2,t.ATTRIBUT3,t1.VALUEOFOMGLOL,t2.VALUEOFOMGLOL,t3.VALUEOFOMGLOL
    FROM mytable t
    JOIN mytable t1 ON t.ATTRIBUT1=t1.ATTRIBUT1 AND t.ATTRIBUT2=t1.ATTRIBUT2 AND t.ATTRIBUT3=t1.ATTRIBUT3 AND t1.OMGLOL = 'ATTRIBUT4'
    JOIN mytable t2 ON t.ATTRIBUT1=t2.ATTRIBUT1 AND t.ATTRIBUT2=t2.ATTRIBUT2 AND t.ATTRIBUT3=t2.ATTRIBUT3 AND t2.OMGLOL = 'ATTRIBUT5'
    JOIN mytable t3 ON t.ATTRIBUT1=t3.ATTRIBUT1 AND t.ATTRIBUT2=t3.ATTRIBUT2 AND t.ATTRIBUT3=t3.ATTRIBUT3 AND t3.OMGLOL = 'ATTRIBUT6'
    

    Und schenk' Deinem Kollegen zur nächsten Weihnachtsfeier ein Buch über Datenbank-Normalformen.



  • hallo, vielen dank schonmal fuer die antwort 😎

    habe es zwar noch nicht ausprobiert, bin gerade damit beschaeftigt den umweg ueber xml wieder rauszumachen. die loesung hat mir nicht gefallen.
    aber das was du mir geschrieben hast sieht schon ganz gut aus. das mit den zeilen hast du richtig verstanden, und dass man das problem direkt ueber sql loesen kann, daran hab ich gar nicht gedacht. klingt jedenfalls sinnvoll. ist zumindest programmiertechnisch mit weniger arbeit verbunden. stellt es aber nicht eine wesentlich hoehere belastung der datenbank dar?

    es handelt sich uebrigens um den ms sql server 2005. sollte also machbar das auf sql ebene zu loesen.

    die spalten wollte ich beim datatable zur laufzeit einfuegen, weil ich am ende bestimmte daten in einem excelsheet haben will, andere wiederrum nicht.
    also dachte ich mir, dass ich die gesamten datensaetze am besten so wie sie sind in eine datatable lade und diese so manipuliere dass ich am ende das gewuenschte ergebniss bekomme. anschliessend soll die tabelle komplett in excel eingelesen werden und gut ist.

    jetzt stelle ich allerdings fest, dass man mit sql so ziemlich alles machen kann, auch die ganzen rechnungen die anstehen. ich sehe schon dass ich meine sql kentnisse noch massiv ausbauen sollte. das buch zu weihnachten schenke ich also zunaechst mal mir 😉

    und wenn ich bis dahin rausgefunden habe, wer die datenbank so verunstaltet hat, dann kriegt der jenige auch ein passendes present.

    diese grundsaetzliche frage bzgl. der datatables bleibt allerdings bestehen.
    wuerde gerne wissen wie sich das mit der zeilen spalten beziehung zu einander verhaellt wenn man neue spalten ins datatable einfuegt.



  • DaEgi schrieb:

    stellt es aber nicht eine wesentlich hoehere belastung der datenbank dar?

    Nö, wenn die Zeilenanzahl sich nicht gerade im Millionenbetrag befindet, dürfte es vernachlässigbar sein. Wenn es langsam wird, und keine weiteren Zeilen eingefügt/geändert werden müssen könnte man ein Index über (ATTRIBUT1,ATTRIBUT2,ATTRIBUT3,OMGLOL) erwägen.

    DaEgi schrieb:

    jetzt stelle ich allerdings fest, dass man mit sql so ziemlich alles machen kann,

    Vorsicht, SQL ist nicht Turing-vollständig.

    DaEgi schrieb:

    diese grundsaetzliche frage bzgl. der datatables bleibt allerdings bestehen.
    wuerde gerne wissen wie sich das mit der zeilen spalten beziehung zu einander verhaellt wenn man neue spalten ins datatable einfuegt.

    Ich weiß nicht wie sich das mit einem Strong-typed-Dataset verhält, da die Tabellenzeilen als Klasse abgebildet werden. Man fügt ja zur Laufzeit auch nicht irgendwelche Attribute zu Klassen (im Normalfall) hinzu. Bei 'wilden' DataSets, die per Indexer angefaßt werden, dürfte es kein Problem sein.


Anmelden zum Antworten