Auto-Inkrementierungsfelder (FireDAC)
Nach oben zu Bearbeiten von Daten (FireDAC)
Inhaltsverzeichnis
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 |
|
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 |
|
|
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:
- TField.DataType = ftAutoInc (TFDAutoIncField), bei dtInt32 oder dtUInt32; ansonsten einer der numerischen ftXxxx-Datentypen.
- TField.Required = False.
- TField.ReadOnly = True.
- TField.ProviderFlags = [pfInWhere] oder [pfInWhere, pfInKey], wenn die Spalte Teil eines Primärschlüssels ist.
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:
- ClientAutoIncrement zum Aktivieren oder Deaktivieren
- AutoIncrementSeed zum Festlegen eines Anfangswertes
- AutoIncrementStep zum Festlegen einer Schrittweite
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:
- Wenn UpdateOptions.FetchGeneratorsPoint =
gpNone
, ist das clientseitige Füllen per Sequenz deaktiviert. - Wenn pfInUpdate der Wert von TField.ProviderFlags ist, wird die Spalte aus der INSERT/UPDATE-Klausel ausgeschlossen.
- Wenn FetchOptions.Items auf fiMeta gesetzt ist, wird die Spalte als auto-inkrementierbar erkannt.
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
- Eindeutige Kennzeichnungsfelder
- Generieren von Aktualisierungsanweisungen
- Zwischenspeichern von Aktualisierungen
Beispiele
- Felder von FireDAC Autoinc (Beispiel)