Eine Aktualisierungsanweisung ausführen - Index

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Die Borland Database Engine - Index


Hinweis: Die Borland Database Engine (BDE) ist veraltet und wird nicht mehr weiterentwickelt. Die BDE wird Unicode beispielsweise nie unterstützen. Sie sollten mit der BDE keine neuen Entwicklungen vornehmen. Überprüfen Sie, ob Sie Ihre vorhandenen Datenbankanwendungen nicht von der BDE nach dbExpress migrieren können.

Die Methode ExecSQL einer Aktualisierungskomponente wendet die Aktualisierungen für den aktuellen Datensatz manuell an. Anders als die Methode Apply bindet ExecSQL die Parameter in der SQL-Anweisung nicht, bevor sie diese ausführt. Die Methode ExecSQL wird größtenteils in Ereignisbehandlungsroutinen für das Ereignis OnUpdateRecord (bei Verwendung der BDE) oder das Ereignis BeforeUpdateRecord (bei Verwendung einer Client-Datenmenge) aufgerufen.

Weil ExecSQL keine Parameterwerte bindet, wird die Methode hauptsächlich verwendet, wenn die SQL-Anweisungen des Aktualisierungsobjekts keine Parameter beinhalten. Sie können auch Apply verwenden, selbst wenn keine Parameter angegeben sind, aber ExecSQL ist effizienter, weil es keine Überprüfung auf Parameter vornimmt.

Wenn die SQL-Anweisungen Parameter beinhalten, können Sie dennoch ExecSQL verwenden, müssen aber zuvor explizit Parameter binden. Wenn Sie die BDE verwenden, um Aktualisierungen zwischenzuspeichern, können Sie Parameter explizit binden, indem Sie die DataSet-Eigenschaft des Aktualisierungsobjekts setzen und dann seine Methode SetParams aufrufen. Wenn Sie zum Zwischenspeichern von Aktualisierungen eine Client-Datenmenge verwenden, müssen Sie dem von TUpdateSQL verwalteten, zugrunde liegenden Abfrageobjekt Parameter bereitstellen. Weitere Informationen dazu finden Sie unter Die Query-Eigenschaft einer Aktualisierungskomponente verwenden.

Warnung: Wenn Sie die Eigenschaft UpdateObject der Datenmenge nutzen, um die Datenmenge und das Aktualisierungsobjekt einander zuzuordnen, wird ExecSQL automatisch aufgerufen. In diesem Fall sollten Sie ExecSQL nicht in einer Ereignisbehandlungsroutine für OnUpdateRecord oder BeforeUpdateRecord aufrufen, weil damit ein zweites Mal versucht wird, die Aktualisierung für den aktuellen Datensatz anzuwenden.

Die Ereignisbehandlungsroutinen für OnUpdateRecord und BeforeUpdateRecord geben mit einem UpdateKind-Parameter des Typs TUpdateKind den Aktualisierungstyp an, der angewendet werden soll. Sie übergeben diesen Parameter der ExecSQL-Methode, um festzulegen, welche SQL-Aktualisierungsanweisung verwendet werden soll. Der folgende Quelltext demonstriert dies unter Verwendung einer BeforeUpdateRecord-Ereignisbehandlungsroutine:

procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet;
          DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);
begin
  with UpdateSQL1 do
  begin
    DatabaseName := (SourceDS as TDBDataSet).DatabaseName;
    SessionName := (SourceDS as TDBDataSet).SessionName;
    ExecSQL(UpdateKind);
    Applied := True;
  end;
end;
void __fastcall TForm1::BDEClientDataSet1BeforeUpdateRecord(TObject *Sender,
   TDataSet *SourceDS, TCustomClientDataSet *DeltaDS, TUpdateKind UpdateKind, bool &Applied)
{
  TDBDataSet *pSrcDS = dynamic_cast<TDBDataSet *>(SourceDS);
  UpdateSQL1->DatabaseName = pSrcDS->DatabaseName;
  UpdateSQL1->SessionName = pSrcDS->SessionName;
  UpdateSQL1->ExecSQL(UpdateKind);
  Applied = true;
}

Wird während der Ausführung des Aktualisierungsprogramms eine Exception ausgelöst, wird die Ausführung im OnUpdateError-Ereignis fortgesetzt, falls dieses definiert ist.

Siehe auch


Themen