テーブルの閲覧(FireDAC)
コマンドの操作(FireDAC) への移動
目次
TFDTable の利用
1 つのデータベース テーブルを参照し、レコードをソートおよびフィルタし、データを編集するために、FireDAC は TFDTable コンポーネントを提供しています。TFDTable は、TFDTable プロパティ値と呼び出されたメソッドをベースに SELECT 文を透過的に生成し、それを DBMS へ送信します。
TFDTable には、操作モードが 2 つあります:
- ライブ データ ウィンドウ モード。大量のデータ内を最小限のメモリ使用量で双方向にナビゲートできます。
- 標準モード。このモードは TFDQuery と同様です。単一の SELECT コマンドを生成し、結果セットを使用してテーブル レコードを順にナビゲートします。
テーブルを開くには、TableName プロパティを指定する必要があります。さらに、IndexFieldNames プロパティや IndexName プロパティも設定できます。
- メモ: IndexName プロパティを使用するには、fiMeta が FetchOptions.Items に含まれていなければなりません。例:
FDTable1.TableName := 'CUSTOMERS';
FDTable1.IndexFieldNames := 'CustNo';
FDTable1.Open;
TFDTable でフィールド名が強制的に引用符で囲まれるようにするには、FormatOptions.QuoteIdentifiers を True に設定します。
TFDTable を TClientDataSet および TDataSetProvider と使用する際の注意
TFDTable コンポーネントを TClientDataSet および TDataSetProvider(DataSnap)と使用する場合、TFDTable は、修整のたびにデータセット全体を再度オープンします。この問題を回避するには、次のいずれかを行います:
- FetchOptions.Unidirectional プロパティを
true
に設定する - リンクされたクライアント データセットを開く前に、FetchOptions.AutoClose プロパティを
false
に設定する
ライブ データ ウィンドウ モード
ライブ データ ウィンドウ(LDW)モードの場合、FireDAC では、クエリを発行し、2 * FetchOptions.RowsetSize の数のレコードだけをメモリに保持します(これがテーブル データを参照する "ウィンドウ" になります)。アプリケーションでテーブル データ内をナビゲートすると、FireDAC は、LDW を必要な位置まで自動的にスクロールします。これには、次のような利点があります。
- メモリ使用量が最小限に抑えられ、大量のデータを一方向データセットと同じように扱えます。
- 一方向データセットとは異なり、双方向ナビゲーションが可能です。
- 常に新しいデータが提供されるので、データセットを更新する必要性が低減されます。
- ソート、レコード検索、最後のレコードへの移動などを実行するのに必要な、すべての結果セット データの取得を遅延なく行えます。
The 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 モードをオフにすることができます。