Christopher: ASP: eigene DataRow-Klasse

Hallo allerseits,

ich habe folgendes Klassdesign:

PersistenceObjectList (POList)
|- DataTable

PersistenceObject (PO)
|- DataRow

Es geht darum, mir eine eigene Implementierung der DataTable zu
bauen. Jede einzelne Row innerhalb dieser DataTable wird über die
Klasse PO dargestellt (erbt von DataRow).
Das Befüllen der DataTable funktioniert bereits einwandfrei, allerdings
sind die einzelnen Rows in dieser Table nicht von dem gewünschnten
Typ PO, ein Casten dorthin schmeisst eine Exception. (could not
cast DataRow to PO)

Mein bisheriger Code zum Auslesen der Daten:
dba.SelectCommand = new OdbcCommand(sql);
dba.SelectCommand.Connection = connection;
dba.Fill(ret);
Wobei ret eine POListe ist.

Es müsste eine Möglichkeit geben, der Fill-Methode zu sagen, welche
Klasse er für die jeweiligen Rows nehmen soll. Doch so etwas habe ich
bisher leider nicht finden können.

Hat einer von euch bereits damit Erfahrung gemacht?

Besten Dank
Christopher

  1. Hallöchen,

    ohne den tieferen Sinn deines Vorhabens in Frage stellen zu wollen,
    ODBCCommand stammt aus System.Data.Odbc und benutzt die Klassen aus System.Data[.Common|ODBC]. Also in dem Fall System.Data.DataTable und System.Data.DataRow und so weiter.

    Wie du auch mit Lutz Roeder's Reflector feststellen wirst, ist der Code von ODBCDataAdaptern recht statisch im Framework. Dass du es nicht gefunden hast zeugt evt davon, dass es es auch nicht so gibt. :(
    Und dass es nicht von "abstrakt" nach "spezifisch" casten kann, weil es ja deinen speziellen Typen nicht kennt, dürfte auch erwartungsgemäss sein.

    Wenn du jetzt also unbedingt eine spezielle Implementierung von Persistenzobjekten à la deiner PO und POList machen möchtest, dann solltest du eine spezielle Implementierung der Interfaces System.Data.IDbDataAdapter, IDbCommand und so weiter hinzufügen.

    Letztenendes ist ein DataAdapter auch nichts anderes als ein DataReader, der zusätzlich in der Lage ist, DataRows zu erzeugen und diesen dann einen geeigneten RowState zu geben.

    Cheers,
    so long
    Frank

    1. Hallo,

      ich konnte das Problem in der Zwischenzeit lösen.
      In der POList-Klasse musste ich die Methode NewRowFromBuilder()
      überschreiben und an der Stelle dann den Konstruktor des POs
      aufrufen. Funktioniert nun wunderbar ;)

      Jedoch besteht noch ein Problem:
      Wie kann ich der POList ein PO (Row) hinzufügen, welches noch
      nicht in der Datenbank persistiert ist?
      Mittels POList.ImportRow(PO) scheint es das zwar hinzuzufügen,
      jedoch zeigt der Count der Rows der POListe 0 an.

      Danke für deine Bemühungen
      Christopher

      1. Hi,

        ich kenne deinen Code überhaupt nicht, weiss nicht, warum du eine Methode "ImportRow" implementiert hast, welche Interfaces du implementiert (du leitest von DataRow ab glaub ich gelesen zu haben) hast für deinen Nachbau usw. Wie soll ich dir da noch konkreter helfen können?

        Bei dem ImportRow() und POList.Count Problem importiert das eine vielleicht ins Nirwana und / oder das andere ruft die falschen Informationen ab. Bist du dir sicher, dass mittels ImportRow() das übergebene PO:DataRow auch wirklich in der (inneren) DataRowCollection von POList:DataTable landet?

        Nochmal der Hinweis: Analysiere den .Net Framework Code mittels Reflector und schau dir an, was genau gemacht wird, wenn du Rows hinzufügst und ziehe daraus die Schlüsse, welche Methoden du wie überschreiben musst?

        Und warum leitest du von DataTable ab? Warum nimmst du nicht einfach ne List<PO> (ein Generic) mit Typensicherheit um eine Menge von PO zu kapseln?

        Ciao, Frank

        1. Hallo,

          OK, mittels DataTable.Rows.Add() kann man erfolgreich eine Reihe
          hinzufügen.

          Habe nun meine Probleme beseitigt.

          Danke für deine Hilfen.

          Grüße
          Christopher

          BTW: Die Methode importRow() kommt nicht von mir.