データ型マッピング(FireDAC)
オプションの設定(FireDAC) への移動
FireDAC には、柔軟性の高い調整可能なデータ型マッピング システムが用意されているので、FireDAC への移行やデータ表現の最適化を手軽に行うことができます。
概要
データ型マッピングにより、以下が可能になります。
- FireDAC ドライバで返される結果セット列のデータ型から、アプリケーションで優先的に使用されるデータ型へのマッピング。
- アプリケーションで定義されているコマンド パラメータのデータ型から、ドライバでサポートされているデータ型へのマッピング。
データ型マッピングは、以下のような場合に役に立ちます。
- アプリケーションを他のデータ アクセス コンポーネントから FireDAC に移行する際に、それらのコンポーネントと互換性のあるデータ型スキーマを作成する場合。
- クロス DBMS アプリケーションの開発時に、サポートされている複数の DBMS のすべてと互換性のあるデータ型スキーマを作成する場合。
- アプリケーションでサポートされていないデータ型を、サポートされているデータ型にマッピングする場合。
- ドライバでサポートされている一般化データ型を、より特化した(または使いやすい)データ型にマッピングする場合。
- より最適なデータ型を指定することで、メモリの消費を最適化する場合。
ある Oracle テーブルから取得した数値列がどうマッピングされる可能性があるかを以下で考えてみましょう。
DDL | ドライバのデータ型 | 優先的に使用されるデータ型 |
---|---|---|
NUMBER(2,0) | dtBcd、Precision=2、Scale=0 | dtSByte |
NUMBER(4.0) | dtBcd、Precision=4、Scale=0 | dtInt16 |
NUMBER(8.0) | dtBcd、Precision=8、Scale=0 | dtInt32 |
NUMBER(18.0) | dtBcd、Precision=18、Scale=4 | dtCurrency |
この表のように、データベースで指定可能なすべての NUMBER(X,Y) データ型に対して、Oracle ドライバでは統一データ型(dtBcd/dtFmtBCD)を返します。しかし、アプリケーション側では、dtInt32 などの、より特化した(または使いやすい)データ型を優先的に使用する可能性があります。また、FireDAC では、dtBcd/dtFmtBCD データ型には 34 バイト長の TBcd データ構造体を使用し、dtInt32 データ型には 4 バイト長の Integer を使用します。
定義
FireDAC では、コマンドを準備するときにマッピング ルールを適用します。コマンドが準備された後は、ルールを変更しても影響はありません。データ型が複数のルールに従う場合、最初のルールだけが使用されます。MaxStringSize、MaxBcdPrecision、MaxBcdScale の各プロパティは、マッピング ルールより先にソース データ型に適用されます。
アプリケーションでデータ型マッピングを定義するには、FormatOptions.OwnMapRules を True に設定し、MapRules コレクションの内容を設定する必要があります。このコレクションの各項目は TFDMapRule クラス型で、単一のマッピング ルールを表します。結果セット列の場合、各ルールでは、ドライバから返されるソース データ型から、アプリケーションで優先的に使用されるターゲット データ型への変換を定義します。コマンド パラメータの場合、各ルールでは、アプリケーションで指定されているターゲット データ型から、ドライバでサポートされているソース データ型への変換を定義します。名前に基づくルールを除き、すべてのルールは、どちらの場合も双方向に機能します。
各ルールは TFDMapRule の以下のプロパティで定義されます。
プロパティ | 説明 |
---|---|
PrecMin/PrecMax | ソース データ型の数値精度の範囲を定義します。 |
ScaleMin/ScaleMax | ソース データ型の数値スケールの範囲を定義します。 |
SizeMin/SizeMax | ソース データ型の文字列長の範囲を定義します。 |
SourceDataType | ソース(変換元)データ型 |
TargetDataType | ターゲット(変換先)データ型 |
NameMask | 列名マスク |
TypeMask | 列のデータ型マスク |
ルールで精度、スケール、サイズが使用されない場合、その値は -1(デフォルト値)でなければなりません。ソース データ型が特定のルールに従う場合、列データ型は、対応する TargetDataType を使って定義されます。
例
先ほどのサンプルの場合、マッピング ルールを定義するには、以下のコードを使用します。
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;