Datentypzuordnung (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Festlegen von Optionen (FireDAC)


FireDAC stellt ein flexibles anpassbares Datentypzuordnungssystem bereit, mit dem Sie die Migration zu FireDAC vereinfachen oder Datendarstellungen optimieren können.

Allgemeine Informationen

Mit der Datentypzuordnung können Sie folgende Typen zuordnen:

  • Datentypen aus Ergebnismengen, die von einem FireDAC-Treiber zurückgegeben wurden, zu Datentypen, die für die Anwendung besser geeignet sind.
  • Datentypen von Anweisungsparametern, die von einer Anwendung definiert wurden, zu vom Treiber unterstützten Datentypen.

Die Datentypzuordnung eignet sich für:

  • Das Erstellen des mit anderen Datenzugriffskomponenten kompatiblen Datentypschemas beim Migrieren der Anwendung von diesen Komponenten zu FireDAC.
  • Das Erstellen des mit mehreren unterstützten DBMS kompatiblen Datentypschemas beim Entwickeln einer DBMS-übergreifenden Anwendung.
  • Die Zuordnung der Datentypen, die nicht von einer Anwendung unterstützt werden, zu unterstützten Datentypen.
  • Die Zuordnung der allgemeinen Datentypen, die von einem Treiber unterstützt werden, zu spezielleren/praktischeren Datentypen.
  • Die Optimierung des Speicherbedarfs durch Festlegen von optimalen Datentypen.

Im Folgenden werden als Beispiel eine SELECT-Anweisung der numerischen Spalte aus einer Oracle-Tabelle und die möglichen Zuordnungen dargestellt:

DDL Treiberdatentyp Bevorzugter Datentyp
NUMBER(2,0) dtBcd, Genauigkeit=2, Skalierung=0 dtSByte
NUMBER(4,0) dtBcd, Genauigkeit=4, Skalierung=0 dtInt16
NUMBER(8,0) dtBcd, Genauigkeit=8, Skalierung=0 dtInt32
NUMBER(18,0) dtBcd, Genauigkeit=18, Skalierung=4 dtCurrency

Wie Sie sehen, gibt der Oracle-Treiber einen einheitlichen Datentyp (dtBcd/dtFmtBCD) für alle möglichen NUMBER(X,Y)-Datentypen zurück. Für eine Anwendung sind aber möglicherweise speziellere/praktischere Datentypen, wie dtInt32, besser geeignet. Außerdem verwendet FireDAC eine 34 Byte lange TBcd-Datenstruktur für den Datentyp dtBcd/dtFmtBCD und ein 4 Byte langes Integer für dtInt32.

Definition

FireDAC wendet die Zuordnungsregeln bei der Anweisungsvorbereitung an. Nach der Vorbereitung der Anweisung haben Regeländerungen keine Auswirkungen. Wenn der Datentyp mit mehreren Regeln übereinstimmt, dann wird nur die erste verwendet. Die Eigenschaften MaxStringSize, MaxBcdPrecision und MaxBcdScale werden für den Quelldatentyp vor den Zuordnungsregeln angewendet.

Zur Definition der Datentypzuordnung muss eine Anwendung FormatOptions.OwnMapRules auf True setzen und die MapRules-Sammlung füllen. Jedes Element in der Sammlung hat die Klasse TFDMapRule und repräsentiert eine einzelne Zuordnungsregel. Bei einer Ergebnismengenspalte definiert jede Regel eine Transformation des von einem Treiber zurückgegebenen Quelldatentyps in einen Zieldatentyp, der für eine Anwendung bevorzugt wird. Bei einem Anweisungsparameter definiert die Regel eine Transformation eines von einer Anwendung festgelegten Zieldatentyps in einen Quelldatentyp, der von einem Treiber unterstützt wird. Alle Regeln, außer denjenigen auf Namensbasis, arbeiten für beide Fälle bidirektional.

Jede Regel wird durch die TFDMapRule-Eigenschaften definiert:

Eigenschaften Beschreibung
PrecMin/PrecMax Definiert den Bereich der numerischen Genauigkeit des Quelldatentyps.
ScaleMin/ScaleMax Definiert den Bereich der numerischen Skalierung des Quelldatentyps.
SizeMin/SizeMax Definiert den Bereich der String-Länge des Quelldatentyps.
SourceDataType Quelldatentyp.
TargetDataType Zieldatentyp.
NameMask Maske des Spaltennamens.
TypeMask Typmaske des Spaltennamens.

Wenn in der Regel die Genauigkeit, Skala (Vor- bzw. Nachkommastellen) oder Größe nicht verwendet wird, dann muss der Wert -1 sein (Vorgabewert). Wenn ein Quelldatentyp mit einer bestimmten Regel übereinstimmt, dann wird ein Spaltendatentyp mit dem entsprechenden TargetDataType definiert.

Beispiel

Verwenden Sie den folgenden Code, um Zuordnungsregeln für das obige Beispiel zu definieren:

 with FDConnection1.FormatOptions do begin
   OwnMapRules := True;
   with MapRules.Add do begin
     ScaleMin := 0;
     ScaleMax := 0;
     PrecMin := 0;
     PrecMax := 2;
     SourceDataType := dtBcd;
     TargetDataType := dtSByte;
   end;
   with MapRules.Add do begin
     ScaleMin := 0;
     ScaleMax := 0;
     PrecMin := 3;
     PrecMax := 4;
     SourceDataType := dtBcd;
     TargetDataType := dtInt16;
   end;
   with MapRules.Add do begin
     ScaleMin := 0;
     ScaleMax := 0;
     PrecMin := 5;
     PrecMax := 8;
     SourceDataType := dtBcd;
     TargetDataType := dtInt32;
   end;
   with MapRules.Add do begin
     ScaleMin := 4;
     ScaleMax := 4;
     PrecMin := 18;
     PrecMax := 18;
     SourceDataType := dtBcd;
     TargetDataType := dtCurrency;
   end;
 end;