Auto-Inkrementierungsfelder (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Bearbeiten von Daten (FireDAC)

Allgemeine Informationen

Mit FireDAC kann ein neuer Datensatz mit einer Auto-Inkrementierungsspalte (Zählerspalte) eingefügt und ein neuer Wert für diese Spalte zurückgegeben werden. Dies kann für sofortige Aktualisierungen sowie für zwischengespeicherte Aktualisierungen ausgeführt werden. Je nach DBMS können die Auto-Inkrementierungsfelder entweder mit einem speziellen IDENTITY-Spaltendatentyp (oder einem ähnlichen Spaltendatentyp) oder mit einem Generator (oder einer Sequenz) und einem Tabellen-Trigger implementiert werden:

DBMS Implementierung von Auto-Inkrementierungsspalten Erkennung
Advantage Database Datentyp AUTOINC Automatisch als Auto-Inkrementierungsdatentyp.
Firebird
  • Generator und BEFORE INSERT-Trigger
  • Firebird 3.0: GENERATED BY DEFAULT AS IDENTITY
Automatische und manuelle Angabe. Siehe unten.
InterBase Generator und BEFORE INSERT-Trigger Automatische und manuelle Angabe. Siehe unten.
IBM DB2 Datentyp GENERATED AS IDENTITY Automatisch als Auto-Inkrementierungsdatentyp.
Informix Datentyp SERIAL Automatisch als Auto-Inkrementierungsdatentyp.
MS Access Datentyp COUNTER Automatisch als Auto-Inkrementierungsdatentyp.
MS SQL Server Datentyp IDENTITY Automatisch als Auto-Inkrementierungsdatentyp.
MySQL Datentyp AUTO_INCREMENT Automatisch als Auto-Inkrementierungsdatentyp.
Oracle
  • Sequenz und BEFORE INSERT FOR EACH ROW-Trigger
  • Oracle 12c und höher: GENERATED AS IDENTITY-Datentyp
  • Manuelle Angabe. Siehe unten.
  • Automatisch als Auto-Inkrementierungsdatentyp.
PostgreSQL Datentyp SERIAL Automatisch als Auto-Inkrementierungsdatentyp.
SQL Anywhere Datentyp IDENTITY Automatisch als Auto-Inkrementierungsdatentyp.
SQLite Datentyp INTEGER PRIMARY KEY AUTOINCREMENT Automatisch als Auto-Inkrementierungsdatentyp.
Sybase Adaptive Server Enterprise Datentyp IDENTITY Automatisch als Auto-Inkrementierungsdatentyp.
Teradata Database Datentyp GENERATED AS IDENTITY Automatisch als Auto-Inkrementierungsdatentyp, wenn ExtendedMetadata True ist.

Automatische Erkennung

FireDAC erkennt eine Spalte mit einem Auto-Inkrementierungsdatentyp automatisch, und definiert sie als dtIntXxx, [caAutoInc, caReadOnly, caAllowNull]. Dies führt zur folgenden TField-Konfiguration:

FireDAC erkennt begrenzte Sätze der Firebird-Auto-Inkrementierungsspalten automatisch und setzt sie auf dtIntXxx, [caAutoInc, caAllowNull], wenn:

  • Erweiterte Metadaten aktiviert sind.
  • Eine Tabelle einen BEFORE INSERT-Trigger hat.
  • Der Trigger von einer einzelnen Spalte und einem einzelnen Generator abhängt. Diese Spalte wird als Auto-Inkrementierungsspalte erkannt.

Manuelle Angabe

Für Oracle, weitere Firebird-/InterBase-Fälle und andere Spalten kann der Auto-Inkrementierungsmodus vom Programmierer mit einer der folgenden Optionen festgelegt werden:

  • Setzen Sie UpdateOptions.AutoIncFields auf die Liste mit den Namen der Auto-Inkrementierungsspalten. Wenn eine Spalte einen dtInt32-/dtUInt32-Datentyp hat, dann wird das Feld TFDAutoIncField erstellt.
  • Erstellen Sie zur Entwurfs- oder Laufzeit ein TFDAutoIncField-Feld. Die Spalte muss den Feldtyp ftAutoInc, ftInteger oder ftLongWord haben. Für andere Datentypen können Sie die Datentypzuordnung TargetDataType = dtInt32 verwenden.
  • Setzen Sie für ein Auto-Inkrementierungsfeld TField.AutoGenerateValue auf arAutoInc. Diese Methode erstellt kein TFDAutoIncField, sie arbeitet mit beliebigen Feldtypen, und das Setzen von weiteren Feldeigenschaften, wie ProviderFlags, Required und ReadOnly, kann erforderlich sein.

All diese Methoden führen schließlich zu TField.AutoGenerateValue = arAutoInc.

Client-Auto-Inkrementierung

Standardmäßig verwendet FireDAC die clientseitige Auto-Inkrementierung für die Auto-Inkrementierungsspalten. Nach Aufruf der Methode Insert/Append der Datenmenge erhält die Auto-Inkrementierungsspalte den Wert -1. Bei jedem weiteren Methodenaufruf wird der Wert um -1 (negativ) inkrementiert. Und zwar, damit die vom Client zugeordneten Werte und die vom DBMS zugeordneten Werte unterschieden werden können.

Bei UpdateOptions.RefreshMode <> rmManual erhält die Auto-Inkrementierungsspalte nach Eintragen eines neuen Datensatzes einen positiven Wert.

Mit den TFDAutoIncField-Eigenschaften kann die clientseitige Auto-Inkrementierung angepasst werden:

Clientseitiges Füllen per Sequenz

Wenn ein DBMS Sequenzen oder Generatoren (die Begriffe werden hier als Synonyme gebraucht) unterstützt, dann kann FireDAC eine Auto-Inkrementierungsspalte aus einer Sequenz auf einem Client füllen. Dies stellt eine Alternative zur clientseitigen Auto-Inkrementierung dar.

Für die Auto-Inkrementierungsspalte muss pfInUpdate in TField.ProviderFlags und einer der UpdateOptions.FetchGeneratorsPoint-Werte vorhanden sein:

  • gpImmediate – ein nachfolgender Wert wird aus einem Generator in die Methode TDataSet.Insert/Append verschoben. Und auf den Wert kann bereits in der Ereignisbehandlungsroutine TDataSet.OnNewRecord zugegriffen werden. Wenn die Methode TDataSet.Cancel aufgerufen wird, dann geht der Wert verloren.
  • gpDeferred – ein nachfolgender Wert wird in die Methode TDataSet.Post verschoben.

Setzen Sie UpdateOptions.GeneratorName oder TFDAutoIncField.GeneratorName auf einen Generatornamen, der zum Abrufen des nächsten Sequenzwertes verwendet wird.

Allgemeine Konfiguration

Die folgende Konfiguration für Auto-Inkrementierungsspalten gilt für alle DBMS, einschließlich der Unterstützung nativer Auto-Inkrementierungsspalten und der Verwendung von Sequenzen und Triggern:

Für Oracle, Firebird und InterBase müssen die Auto-Inkrementierungsspalten manuell festgelegt werden. Für Datenbanken, die native auto-inkrementierbare Datentypen unterstützen, ist keine weitere Konfiguration erforderlich. Diese Spalten können aber auch in beiden Fällen manuell festgelegt werden.

Haupt/Detail-Behandlung

Wenn Haupt- und Detaildatenmengen über eine Auto-Inkrementierungsspalte der Hauptdatenmenge verknüpft und zwischengespeicherte Aktualisierungen aktiviert sind, sollten Sie den Modus Zentralisierte zwischengespeicherte Aktualisierungen mit der Weitergabe von Änderungen von der Haupt- zu den Detaildatenmengen verwenden.

Siehe auch

Beispiele