Announcement

Collapse
No announcement yet.

Wozu dient eigentlich dass Dataset.Clone

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wozu dient eigentlich dass Dataset.Clone

    Hallo zusammen,

    kann mir jemand von euch sagen wofür die Function ein Dataset zu klonen eigentlich Verwendung findet ? Ich habe es mal verwenden wollen, da ich eine Kopie von einem Dataset brauchte, musst dann aber festellen, dass jede Änderung auch auf den Klon übertragen wurde, Jeder Zeilenwechsel ebenfalls dort durchgeführt wurde.

    Kann mit jemand sagen wofür man es sinnvoll einsetzen kann, bzw. eingesetzt wird. Nur um eine Idee zu bekommen wie ich es nutzen könnte.

    Danke einstweilen

    Astner Klaus

  • #2
    Hallo,

    ADO stellt über die <i>OLE DB Service Client Cursor Engine</i> das RecordSet-Objekt zur Verfügung, das in der Lage ist, Daten völlig autonom zu verwalten. Wenn ein clientseitiger Cursor für dieses RecordSet-Objekt verwendet wird, holt ich ADO mit dem Öffnen des Cursors sofort alle Datensätze vom Server zum Client. Der Client kann dann mit diesen Daten arbeiten (sortieren, filtern usw.), ohne dass jedesmal eine Interaktion mit der SQL Datenbank notwendig wird. Nun gibt es aber Einsatzfälle, in denen der Client (Programm) unabhängige Sichten auf die gleiche Datenmenge benötigt, um zum Beispiel in einer Datenmenge zwei völlig unterschiedliche Datensätze gleichzeitig auswählen und anzeigen zu können. Um zu verhindern, dass der Client in diesen Fällen die Daten nochmals von der SQL-Datenbank abfordern und doppelt im Arbeitsspeicher vorhalten muss, stellt das RecordSet-Objekt die Methode <b>Clone</b> zur Verfügung.

    Mit dem Aufruf der RecordSet-Methode Clone wird die Objektinstanz dupliziert, so dass der Client nun über zwei Interface-Zeiger auf zwei Objektinstanzen zugreifen kann. Somit ist das clonen schneller und effektiver als das reguläre Erzeugen eines neuen RecordSet-Objekts mit dem anschliessenden Abfordern der Datenmenge von der SQL-Datenbank.

    Allerdings greifen alle geklonten RecordSet-Objektinstanzen auf die <b>gleichen Daten</b> zurück, sowohl das Original als auch der Clone arbeiten unmittelbar nach dem Clonen mit der gleichen Datenmenge des Originals. Dies hat beabsichtigte und auch unbeabsichtigte Nebenwirkungen, es kommt entscheidend darauf an, welches Ziel der Entwickler mit dem Clonen des RecordSet-Objekts anstrebt.

    Um den Aufwand für das Clonen zu minimieren, geht ADO standardmässig davon aus, dass der Clone nur ein anderer Zeiger auf die Daten darstellt. Beide RecordSet-Instanzen können bei Lesezugriffen völlig unabhängig voneinander mit den Daten hantieren. Das Positionieren eines Datensatzes, das Filtern der Datenmenge sowie das Verwalten der Bookmarks ist unabhängig. Unmittelbar nach dem Clonen ist die geclonte RecordSet-Instanz auf dem ersten Datensatz positioniert, unabhängig davon, welcher Datensatz beim Original-RecordSet-Objekt ausgewählt war. Beim Clonen gehen ebenfalls alle Filterkriterien "verloren", so dass der Clone alle Datensätze der Original-Datenmenge anzeigt.

    Allerdings wirken alle Schreibzugriffe - egal von welcher Objektinstand ausgelöst - immer auf die gleichen Daten, so dass alle Objektinstanzen von allen Änderungen einer einzigen Instanz betroffen sind.

    Die Verbindung zwischen dem Original- und dem Clone-RecordSet wird erst dann <b>getrennt</b>, wenn einer der beiden die Methode <b>Requery</b> aufruft. Die Methode Requery sorgt dafür, dass die Daten im jeweils betroffenen RecordSet-Objekt durch das Ausführen der Abfrage neu zusammengestellt werden, wenn der Clone eine Verbindung zur Datenbank hat (TADOConnection). Der Aufruf von Requery führt dazu, dass das aufrufende RecordSet eine <b>eigene Datenmenge</b> bekommt.

    Das folgende Beispiel zeigt mit Hilfe eines Clones die im Recordset geänderten Datensätze an:
    <pre>
    aCloneRS := ADODataSet1.Recordset.Clone(adLockUnspecified);
    <font color="#003399"><i>// geklonte Datenmenge filtern: Nur neue/geänderte/gelöschte anzeigen</i></font>
    aCloneRS.Filter := adFilterPendingRecords;
    ADODataSetClone.Recordset := aCloneRS;
    ADODataSetClone.Active := True;
    </pre&gt

    Comment


    • #3
      Vielen Dank für die super Erklärung.

      Mal sehn ob ich damit was anfangen kann.

      Dank

      Comment


      • #4
        Hallo Herr Kosch,

        ich bräuchte die CloneMethode, allerdings ist mir aufgefallen, dass kalkulierte Felder nicht im Clone vorhanden sind. Kann man das irgendwie beheben ?

        Danke einstweilen

        Astner Klau

        Comment

        Working...
        X