テーブルの閲覧(FireDAC)

提供: Appmethod Topics
移動先: 案内検索

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


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

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

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

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 モードをオフにすることができます。

関連項目