Datentypzuordnung (FireDAC)
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;