Announcement

Collapse
No announcement yet.

BatchMove mit ADO ?

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

  • BatchMove mit ADO ?

    Hallo,

    ich speichere eine Tabelle als File mit dem Befehl SaveToFile eines ADODatasets ab.

    Die Datensätze lese ich danach am Client mit LoadFromFile in das ADODataSet wieder ein.

    Wie kann ich jetzt die Datensätze in eine Tabelle des SQL Server einfügen, so wie bei der BatchMove Komponente (ohne ProblemTable ect.) ?

    Danke für die Infos.

    Gruss Stefan

  • #2
    Hallo,

    dazu muss das <b>RecordSet</b>-Objekt wieder über das <b>Connection</b>-Objekt mit der originalen Datenquelle (Datenbank) verbunden werden. Anschliessend sorgt der Aufruf von <b>UpdateBatch</b> dafür, das ADO versucht, alle am RecordSet-Objekt vorgenommenen Änderungen in die originale Datenbank einzuarbeiten. Das folgende Beispiel stammt aus einer Three-tier-Anwendung und demonstriert den Aufruf. Die Interface-Methode <i>Get_Employee</i> übergibt das RecordSet-Objekt dem Client, der später über die Interface-Methode <i>Update</i> alle seine Änderungen einarbeiten kann. Das funktioniert nur dann, wenn das RecordSet-Objekt über <b>adLockBatchOptimistic</b> angefordert wurde:
    <pre>
    function TRDSAppServer.Get_Employee: _Recordset;
    var
    ConnStr: WideString;
    begin
    ConnStr := 'FILE NAME=' + DataLinkDir + '\DBDEMOS.UDL';
    Result := CoRecordSet.Create;
    Result.CursorLocation := adUseClient;
    Result.Open('Employee', ConnStr, adOpenStatic, adLockBatchOptimistic, adCmdTable);
    end;

    function TRDSAppServer.Update(const RS: _Recordset): Integer;
    var
    aRS : _RecordSet;
    ConnStr : WideString;
    begin
    ConnStr := 'FILE NAME=' + DataLinkDir + '\DBDEMOS.UDL';
    aRS := CoRecordset.Create;
    aRS.Open(RS, ConnStr, TOleEnum(adOpenUnspecified),
    TOleEnum(adLockUnspecified),
    TOleEnum(adCmdUnspecified));
    aRS.UpdateBatch(adAffectAll);
    Result := 1;
    end;
    </pre>

    P.S: Im Demos-Verzeichnisbaum von Delphi 5 findet sich das Beispielprojekt »rdstest.bpg«, das demonstriert, wird ein RecordSet-Objekt von einem Rechner zu anderen transport wird. Ich habe dieses Beispiel nur um die Methode Update erweitert

    Comment


    • #3
      Hallo,

      gibt es eine Möglichkeit bei dem UpdateBatch zu sagen, dass falls
      die Datensätze in der Zwischenzeit gelöscht wurden, ADO diese neu
      anlegt.

      Der Grund ist, dass diese Tabelle immer neu aufgebaut werden muss, d.h. im Vorfeld löscht eine Delete Anweisung alle Datensätze und nun
      sollen diese Neu Importiert werden.

      Ich habe jetzt momenten keine RDS Connection im Einsatz sondern eine
      ADO Connection. Bei neu angelegten Datensätzen funktioniert das auch
      einwandfrei bzw. bei Änderungen falls der Primärschlüssel noch in der
      Tabelle vorhanden ist.

      Danke für weitere Tipps.

      Stefa

      Comment


      • #4
        Hallo,

        das Problem besteht darin, das jeder Record eines RecordSets über die <b>Status</b>-Eigenschaft (siehe RecordStatus bei TADODataset) vermerkt, ob der Datensatz neu angelegt, geändert oder gelöscht wurde. Wird <i>rsNew</i> vorgefunden, so schickt ADO beim UpdateBatch-Aufruf eine INSERT-Anweisung zur Datenbank, wird allerdings <i>rsModified</i> vorgefunden, erhält die Datenbank eine UPDATE-Anweisung mit den "alten" Werten im WHERE-Part. Dies bedeutet, dass selbst dann, wenn man vor dem UpdateBatch-Aufruf alle Datensätze von Hand durchläuft und eine Dummy-Änderung vornimmt, der UPDATE-Aufruf immer dann ins Leere geht, wenn die Zieltabelle vorher geleert wurde.

        Ich würde daher folgendes machen: <br>
        1. Alle Datensätze in einer Schleife durchgehen, den Wert in <b>RecordStatus</b> auswerten und eigene INSERT-Anweisungen für jeden Datensatz abschicken, der in die Zieltabelle soll. <br>
        2. Connection trennen (d.h. das RecordSet ist wieder Stand alone). <br>
        3. UpdateBatch ohne Connection aufrufen (ADO löscht somit alle Verändungersvermerke), wenn das RecordSet noch weiter genutzt werden soll

        Comment

        Working...
        X