Überschreiben von Eintragsaktualisierungen (FireDAC)
Nach oben zu Bearbeiten von Daten (FireDAC)
Inhaltsverzeichnis
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. |
|
SELECT mit Alias-Spalten und Ausdrücken | Bezieht die falschen Spaltennamen ein. |
|
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.
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:
- TFDQuery OnUpdateRecord
- FireDAC\Samples\Comp Layer\TFDUpdateSQL\Main
Siehe auch
Beispiele
- FireDAC Schema Adapter (Beispiel)
- FireDAC TFDQuery OnUpdateRecord (Beispiel)