テーブルの閲覧(FireDAC)

提供: RAD Studio
移動先: 案内検索

コマンドの操作(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.QuoteIdentifiersTrue に設定します。

TFDTable を TClientDataSet および TDataSetProvider と使用する際の注意

TFDTable コンポーネントを TClientDataSet および TDataSetProvider(DataSnap)と使用する場合、TFDTable は、修整のたびにデータセット全体を再度オープンします。この問題を回避するには、次のいずれかを行います:

ライブ データ ウィンドウ モード

ライブ データ ウィンドウ(LDW)モードの場合、FireDAC では、クエリを発行し、2 * FetchOptions.RowsetSize の数のレコードだけをメモリに保持します(これがテーブル データを参照する "ウィンドウ" になります)。アプリケーションでテーブル データ内をナビゲートすると、FireDAC は、LDW を必要な位置まで自動的にスクロールします。これには、次のような利点があります。

  • メモリ使用量が最小限に抑えられ、大量のデータを一方向データセットと同じように扱えます。
  • 一方向データセットとは異なり、双方向ナビゲーションが可能です。
  • 常に新しいデータが提供されるので、データセットを更新する必要性が低減されます。
  • ソート、レコード検索、最後のレコードへの移動などを実行するのに必要な、すべての結果セット データの取得を遅延なく行えます。

The Filter プロパティ、範囲フィルタリング、IndexFieldNames および IndexName プロパティの設定、Locate および Lookup メソッド、キー検索、レコード番号の設定、ブックマークの設定などは、SELECT コマンドを追加するかメインの SELECT コマンドに追加の句を設定することで実行されます。 FilterIndexFieldNamesIndexName の変更後、データセット内の現在位置も変わる可能性があります。現在位置を保つには、変更前にブックマークを保存し、変更後にそれを復元します。

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.SortLocaleFormatOptions.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.StrsTrimFalse に設定することをお勧めします。

メモ: クライアント側でのソートの照合順序を開発者が調整できない場合は、FetchOptions.CursorKind を ckDefault、ckStatic、ckForwardOnly のいずれかに設定することで、LDW モードをオフにすることができます。

関連項目