Thema: Delphi ADODataset Insert Update

Einzelnen Beitrag anzeigen

gro

Registriert seit: 9. Jul 2004
Ort: Kärnten
17 Beiträge
 
Delphi 10.3 Rio
 
#1

ADODataset Insert Update

  Alt 8. Feb 2006, 14:23
Datenbank: DB2 • Version: V8 • Zugriff über: ADO
Folgendes Problem:

Ich verwende 2 ADOConnections + ADODatasets um von einer Sourcetabelle in eine Targettabelle Daten zu schaufeln.
In der Targettabelle befinden sich aber bereits Daten (gleicher Primarykey) die in der Sourcetabelle bereits vorhanden sind. Wenn nun solch ein Datensatz gefunden wurde sollte auf diesen ein Update gemacht werden.

Meine Lösung:

TargetTable, SourceTable und TargetUpdate sind ADODatasets


Delphi-Quellcode:
TRY
  TargetTable.Insert;
  for iFieldCount := 0 to SourceTable.FieldCount - 1 do begin
    szFieldname := SourceTable.Fields[iFieldCount].FieldName;
    TargetTable.FieldByName(szFieldname).Value :=
           SourceTable.FieldByName(szFieldname).Value;
  end;
  TargetTable.Post; // wenn record vorhanden wird hier eine exception geworfen
EXCEPT
  on e: Exception do begin
    TargetTable.Cancel;

    // alle indexfelder in UPDATESQL befüllen.
    // Die Stringliste aIndexFields und der SQL-Query wird mit einer eigenen Routine befüllt
    TargetUpdate.Active := FALSE;
    for iCount := 0 to aIndexFields.Count - 1 do begin
      szFieldname := aIndexFields[iCount];
      TargetUpdate.Parameters.ParamByName(szFieldname).Value := SourceTable.FieldByName(szFieldname).Value;
    end;
          
    TargetUpdate.Active := TRUE;
    TargetUpdate.Edit;
    for iFieldCount := 0 to SourceTable.FieldCount - 1 do begin
      szFieldname := SourceTable.Fields[iFieldCount].FieldName;
      TargetUpdate.FieldByName(szFieldname).Value := SourceTable.FieldByName(szFieldname).Value;
    end;
    TargetUpdate.Post;
  end;
END;
Dies funktioniert alles recht schön und fast vernünftig.
ABER die Performanze ist dabei unterm Hund da bei jeden Update ein Select ausgeführt wird.
Vergleich bei 15000 Datensätzen
Nur Insert 95 Secunden
Mit Update 920 Sekunden

Nun meine Frage: Wie kann ich den ADODataset TargetTabel so positionieren, das er nach der Exception des Inserts/Post auf den richtigen Datensatz positioniert ist. BZW. wenn ich das TargetTable.Cancel weglasse, wie kann ich den Datensatz danach trotzdem aktualisieren, denn ohne TargetTable.Cancel ist die TargetTable ja richtig positioniert. Wenn ich jetz mit TargetTable.Edit und anschliesendem TargetTable.Post versuche diesen Record upzudaten bekomme ich eine Fehlermeldung (Duplicat Rows) Was mache ich hier falsch?

Mfg Pit und danke im Voraus
Peter (EDV = Ende der Vernunft)
  Mit Zitat antworten Zitat