AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ADODataset Insert Update

ADODataset Insert Update

Ein Thema von gro · begonnen am 8. Feb 2006 · letzter Beitrag vom 16. Feb 2006
 
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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz