テーブルの閲覧(FireDAC)
コマンドの操作(FireDAC) への移動
TFDTable の使用
単一のデータベース テーブルの閲覧、レコードのソートとフィルタリング、データの編集を行うために、FireDAC には TFDTable コンポーネントが用意されています。TFDTable では、TFDTable のプロパティ値と呼び出されたメソッドに基づいて SELECT 文を透過的に生成し、それを DBMS に送信します。
TFDTable には、以下のように 2 つの主な操作モードがあります。
- ライブ データ ウィンドウ モード。大量のデータ内を最小限のメモリ使用量で双方向にナビゲートできます。
- 標準モード。このモードは TFDQuery と似ています。TFDTable では、単一の SELECT コマンドを生成し、結果セットを使用してテーブル レコードを順にナビゲートします。
テーブルを開くには、TableName プロパティを指定する必要があります。さらに、IndexFieldNames プロパティや IndexName プロパティも設定できます。
- メモ: IndexName プロパティを使用するには、FetchOptions.Items に fiMeta を含める必要があります。以下に例を示します。
FDTable1.TableName := 'CUSTOMERS';
FDTable1.IndexFieldNames := 'CustNo';
FDTable1.Open;
TFDTable でフィールド名が強制的に引用符で囲まれるようにするには、FormatOptions.QuoteIdentifiers を True に設定します。
ライブ データ ウィンドウ モード
ライブ データ ウィンドウ(LDW)モードの場合、FireDAC では、クエリを発行し、2 * FetchOptions.RowsetSize の数のレコードだけをメモリに保持します(これがテーブル データを参照する "ウィンドウ" になります)。アプリケーションでテーブル データ内をナビゲートすると、ライブ データ ウィンドウが、必要な位置まで自動的にスクロールされます。これには次のような利点があります。
- メモリ使用量が最小限に抑えられ、大量のデータを一方向データセットと同じように扱えます。
- 一方向データセットとは異なり、双方向ナビゲーションが可能です。
- 常に新しいデータが提供されるので、データセットを更新する必要性が低減されます。
- ソート、レコード検索、最後のレコードへの移動などを実行するのに必要な、すべての結果セット データの取得を遅延なく行えます。
Filter プロパティ、範囲フィルタリング、IndexFieldNames および IndexName プロパティの設定、Locate および Lookup メソッド、キー検索、レコード番号の設定、ブックマークの設定などは、SELECT コマンドを追加するかメインの SELECT コマンドに追加の句を設定することで実行されます。Filter、IndexFieldNames、IndexName の変更後、データセット内の現在位置も変わる可能性があります。現在位置を保つには、変更前にブックマークを保存し、変更後にそれを復元します。
LDW モードでは、Filter プロパティ値は WHERE 句にそのまま使用されます。DBMS やローカルの式エンジンと互換性のある式にするには、アプリケーションで FireDAC エスケープ シーケンスを使用できます。以下に例を示します。
FDTable1.Filter := 'DateField = {d ' + FormatDateTime('yyy-mm-dd', Trunc(MonthCalendar1.Date)) + '}';
FDTable1.Filtered := True;
設計上、LDW モードでは常に ORDER BY 句が SELECT コマンドに適用されます。LDW が正しく機能するための主要な要件は以下のとおりです。
- テーブルには一意キーつまり主キーが必要です。詳細については、「一意識別フィールド」を参照してください。
- ソートの照合順序はサーバー側とクライアント側で同じでなければなりません。そうでない場合は、TFDTable で行の重複が起き、"一意キー違反" エラーが発生するおそれがあります。
LDW モードでは、生成され実行される SQL コマンドの数は最小限に抑えられますが、それでも DB の負荷は TFDQuery より大きくなります。そのため、アプリケーション開発者は、TFDTable と LDW モードを使用すべきかどうかを慎重に見極めなければなりません。
LDW モードの設定
LDW モードは、以下の条件のすべてに合致したときに使用されます。
- CachedUpdates がデフォルトで False になっている。
- FetchOptions.Unidirectional がデフォルトで False になっている。
- FetchOptions.CursorKind が ckAutomatic または ckDynamic に設定されている(ckAutomatic がデフォルト値)。
- テーブルに主キーつまり一意キーがある。
上記の条件が満たされない場合は、標準モードが使用されます。
TFDTable がアクティブでない場合にのみ、モードを変更できます。したがって、テーブルがアクティブでない場合にのみ CachedUpdates を変更できます。さらに、FetchOptions.LiveWindowParanoic(デフォルトで False)と FetchOptions.LiveWindowFastFirst(デフォルトで False)を変更することで、パフォーマンスを改善することができます。
LDW モードでの "一意キー違反" エラーの回避
ソート順序をデータベースとクライアント側で同じにするには、FormatOptions.SortLocale と FormatOptions.SortOptions を使用して、クライアント側でのソート順序を調整することができます。たとえば、ドイツ語を話す開発者であれば、ドイツ語の文字列データが格納された ISO8859_1 文字セットの Firebird データベースにクエリを発行するために、以下のように TFDTable をセットアップすることもできます。
uses
Windows;
...
// Set locale ID to German phone book collation
FDTable1.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT);
// Use the the punctuation and other symbols case insensitive sorting
FDTable1.FormatOptions.SortOptions := [soNoSymbols];
FDTable1.IndexFieldNames := 'NAME';
FDTable1.TableName := 'CUSTOMERS';
FDTable1.Open;
DBMS によっては、次のような追加設定を行えます。
DBMS | 設定 |
---|---|
Firebird | 場合によっては、soNoSymbols を SortOptions に含める必要があります。 |
MySQL | 場合によっては、soNoSymbols を SortOptions に含める必要があります。 |
Oracle | 場合によっては、ALTER SESSION SET NLS_COMP=ANSI を実行する必要があります。 |
SQLite | SortLocale を 0 に設定します。 |
たとえば、Oracle 開発者であれば、次のようなコマンドを実行できます。
FDConnection1.Connected := True;
FDConnection1.ExecSQL('ALTER SESSION SET NLS_COMP=ANSI');
さらに、FormatOptions.StrsTrim を False に設定することをお勧めします。
- メモ: クライアント側でのソートの照合順序を開発者が調整できない場合は、FetchOptions.CursorKind を ckDefault、ckStatic、ckForwardOnly のいずれかに設定することで、LDW モードをオフにすることができます。