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