Überschreiben von Eintragsaktualisierungen (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Bearbeiten von Daten (FireDAC)

Obwohl FireDAC automatisch SQL-Aktualisierungsanweisungen generieren kann, wird dies in einigen Fällen nicht korrekt durchgeführt:

Ursprüngliche SQL-Anweisung Mögliche Fehler in der generierten SQL-Anweisung Mögliche Aktionen
SELECT mit Verknüpfungen (JOIN) Enthält Spalten aus den verknüpften Tabellen.
SELECT mit Gruppierungsoperationen Aktualisiert mehr als einen Datensatz.
SELECT mit allgemeinen Tabellenausdrücken Ermittelt den Namen der zu aktualisierenden Tabelle nicht.
  • Leiten Sie die Aktualisierungen zur korrekten Tabelle um, indem Sie UpdateOptions.UpdateTableName festlegen.
  • Verwenden Sie benutzerdefinierte SQL-Anweisungen.
SELECT mit Alias-Spalten und Ausdrücken Bezieht die falschen Spaltennamen ein.
  • Schließen Sie optional Spalten aus den Nicht-Basistabellen aus den Aktualisierungsanweisungen aus, indem Sie pfInUpdate aus TField.ProviderFlags entfernen und TField.ReadOnly auf True setzen.
  • Geben Sie optional den Basisspaltennamen durch Festlegen von TField.Origin an.
Aufruf einer gespeicherten Prozedur Alle obigen SELECT-Probleme.
Cursorausdrücke und -variable Alle obigen SELECT-Probleme.
Andere Nicht-SELECT-Anweisungen Alle obigen SELECT-Probleme.

Hinweis: Die vorgeschlagenen Aktionen sollten Sie erst ausführen, wenn Sie die Probleme überprüft haben.

FireDAC kann eine Basistabelle und Spaltennamen für Alias- oder verknüpfte (Join) Spalten ermitteln:

DBMS Konfiguration
Advantage Database Nicht unterstützt
Firebird Erforderlicher Verbindungsdefinitionsparameter ExtendedMetadata = True
Informix Nicht unterstützt
InterBase Erforderlicher Verbindungsdefinitionsparameter ExtendedMetadata = True
IBM DB2 Automatisch
MS Access Automatisch
MS SQL Server Erforderlicher Verbindungsdefinitionsparameter ExtendedMetadata = True
MySQL Automatisch
Oracle Nicht unterstützt
PostgreSQL Erforderlicher Verbindungsdefinitionsparameter ExtendedMetadata = True
SQL Anywhere Automatisch
SQLite Automatisch
Teradata Database Erforderlicher Verbindungsdefinitionsparameter ExtendedMetadata = True

Festlegen eines Aktualisierungstabellennamens

In manchen Fällen muss die Anwendung den Namen einer alternativen DB-Tabelle festlegen, in die die Aktualisierungen eingetragen werden. Setzen Sie dazu UpdateOptions.UpdateTableName auf einen erforderlichen Tabellennamen.

Festlegen von Aktualisierungsspaltennamen und -modi

In manchen Fällen muss die Anwendung Spalten aus der SQL-Aktualisierungsanweisung ausschließen. Entfernen Sie dazu pfInUpdate aus TField.ProviderFlags. Und setzen Sie TField.ReadOnly, um keine Änderung des Feldwertes zuzulassen.

Setzen Sie TField.Origin auf einen erforderlichen Wert, um einen alternativen DB-Spaltennamen festzulegen.

Verwenden von TFDUpdateSQL

Mit der Komponente TFDUpdateSQL können Sie:

  • Die von FireDAC generierten SQL-Aktualisierungsanweisungen selektiv überschreiben.
  • Das Eintragen von Aktualisierungen aktivieren, wenn FireDAC die Aktualisierungsanweisungen, wie eine komplexe SELECT-Anweisung oder Aufrufe von gespeicherten Prozeduren, nicht generieren kann.

Im Allgemeinen ist TFDUpdateSQL eine Sammlung von SQL-Aktualisierungsanweisungen, wovon jede spezielle Aufgaben, wie das Einfügen eines neuen Datensatzes in die Datenbank, behandelt. TFDUpdateSQL kann zur Entwurfszeit und/oder zur Laufzeit festgelegt werden.

Festlegung zur Entwurfszeit

Um eine TFDUpdateSQL-Komponente zur Entwurfszeit festzulegen, ziehen Sie die Komponente einfach auf das Formular. Setzen Sie die Datenmengeneigenschaft UpdateObject so, dass sie auf diese Komponente zeigt. Doppelklicken Sie dann auf TFDUpdateSQL, um den "FireDAC-SQL-Aktualisierungseditor" zu öffnen.

FDUpdateSQLEditor.png

Der Editor übernimmt automatisch den Namen der zu aktualisierenden Tabelle aus der zugeordneten Datenmenge und richtet Spalten entsprechend den Datenmengenspalten TField.ProviderFlags und TField.AutoGenerateValue ein.

Verwenden Sie Folgendes, um die Konfiguration zu ändern:

  • Das Kombinationsfeld "Tabellennamen", um den Namen der zu aktualisierenden Tabelle festzulegen.
  • Das Listenfeld "Schlüsselfelder", um eindeutige Kennzeichnungsspalten festzulegen (entsprechend pfInKey in ProviderFlags);
  • Das Listenfeld "Zu aktualisierende Felder", um Spalten festzulegen, die in die Aktualisierung einbezogen werden sollen (entspricht pfInUpdate in ProviderFlags);
  • Das Listenfeld "Aktualisierungsfelder", um Spalten festzulegen, deren Werte nach dem Eintragen der Aktualisierungen aktualisiert werden müssen (entspricht AutoGenerateValue <> arNone).

Mit der Schaltfläche "Aus DB beschreiben" wird die Einrichtung der angegebenen Tabelle vorgenommen, indem deren Metadaten aus der Datenbank abgerufen werden. Mit der Schaltfläche "Auf Standard zurücksetzen" wird die Einrichtung mithilfe der Eigenschaften der Datenmengenfelder vorgenommen. Die weiteren Optionen können auf der Seite "Optionen" angegeben werden.

Wenn die Einrichtung abgeschlossen ist, drücken Sie die Schaltfläche "SQL generieren", um einen vollständigen Satz der SQL-Aktualisierungsanweisungen zu generieren. Mit dem Editor können auf der Seite "SQL-Anweisungen" SQL-Aktualisierungsanweisungen auch manuell bearbeitet werden.

Drücken Sie "OK", um die Änderungen in TFDUpdateSQL zu speichern.

Festlegung zur Laufzeit

Um die TFDUpdateSQL-SQL-Anweisungen zur Laufzeit festzulegen, muss die Anwendung XxxxSQL-Eigenschaften verwenden. Anhand der Parametermarker führen Sie Verweise auf einen bestimmten Spaltenwert in SQL-Anweisungen ein:

  • neuer Spaltenwert – :NEW_<Spaltenname>
  • alter Spaltenwert – :OLD_<Spaltenname>
  • aktueller Spaltenwert – :<Spaltenname>.

Diese Parameterwerte werden durch FireDAC automatisch zugewiesen. Weisen Sie ihnen keinen Wert zu, weil deren Werte überschrieben werden. FireDAC ignoriert Parameter mit anderen Namen.

Die Anweisungsparameter und Anweisungsmakros können nur zur Laufzeit eingerichtet werden. Dazu müssen Sie die Eigenschaft TFDUpdateSQL.Commands verwenden, die Verweise auf die TFDCommand-Objekte zurückgibt. Zum Beispiel:

FDUpdateSQL1.InsertSQL.Text := 'insert into &tab (id, name) values (:new_id, :new_name)';
FDUpdateSQL1.Commands[arInsert].Macros[0].AsRaw := 'Orders';

Verwenden von OnUpdateRecord

Dieses Ereignis ermöglicht das vollständige Überschreiben von Eintragsaktualisierungen aus einer Datenmenge. Die Eigenschaften der Datenmengenfelder können vom Code der Ereignisbehandlungsroutine gelesen werden:

  • OldValue – gibt den ursprünglichen Feldwert zurück, den abgerufenen Wert bzw. den Wert nach dem letzten Aufruf von CommitUpdates/CancelUpdates.
  • CurValue/Value – gibt den aktuellen Feldwert zurück.

Sie können TFDUpdateSQL und OnUpdateRecord auch kombinieren, um ein halbautomatisches Eintragen von Aktualisierungen in verschiedene Tabellen oder Datenbanken zu aktivieren.

Einzelheiten finden Sie bei der Beschreibung des Ereignisses OnUpdateRecord und in den FireDAC-Demos:

Siehe auch

Beispiele