メタデータに関する質問(FireDAC)

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

FAQ(FireDAC) への移動


このトピックでは、データの取得に関係する質問と回答の一覧を扱います。

Q1: データベース内にテーブルが存在するかどうかを確認するメソッドはありますか。

A: 次の 2 つの基本のメソッドがあります。

1)

try
FDQuery1.Open('select * from tab where 0 = 1');
Result := True;
except
on E: EFDDBEngineException do
if E.Kind = ekObjNotExists then
Result := False
else
raise;
end;

2)

var
oList: TStrings;
begin
oList := TStringList.Create;
try
FDConnection1.GetTableNames('', '', ATableName, oList, [osMy, osOther, osSystem],
[tkTable, tkTempTable, tkLocalTable]);
Result := oList.Count > 0;
finally
oList.Free;
end;
end;

最初のメソッドの方が最適化されています。

Q2: Oracle の場合、TFDMetaInfoQuery を使ってパッケージ プロシージャを取得することはできますか。

A: 以下のコードでは、PACKAGE_NAME という Oracle パッケージのプロシージャのリストが返されます。

FDMetaInfoQuery1.BaseObjectName := 'PACKAGE_NAME';
FDMetaInfoQuery1.MetaInfoKind := mkProcs;
FDMetaInfoQuery1.Open;

Q3: TFDMetaInfoQuery を使ってインデックス名を取得するにはどうすればよいでしょうか。

A: 以下のコードでは、MY_TAB テーブルのインデックスのリストが返されます。

FDMetaInfoQuery1.ObjectName := 'MY_TAB';
FDMetaInfoQuery1.MetaInfoKind := mkIndexes;
FDMetaInfoQuery1.Open;

Q4: クエリ ビルダや設計時エディタやメタデータ取得関数で返される、現在のスキーマ内のオブジェクト名の前には、スキーマ/カタログ名が付いています。 これを取り除くにはどうすればよいでしょうか。

A: 次の 2 つの方法があります。

  • TFDConnection.GetXxxxName の呼び出し時に AFullName を False に設定します。
  • FireDAC には、MetaDefCatalog および MetaDefSchema という 2 つの一般的な接続定義パラメータがあります。 DBMS によって異なりますが、片方または両方のパラメータがサポートされています(詳細については、「FireDAC データベース接続」を参照)。指定した MetaDefCatalog カタログや MetaDefSchema スキーマにオブジェクトが属している場合には、そのカタログ/スキーマ名はオブジェクト名から省略されます。 そのため、異なるカタログ/スキーマにアプリケーションを配置する必要がある場合には、MetaDefCatalog/MetaDefSchema を開発用のカタログ/スキーマ名に設定してください。

Q5: パブリック シノニムを使って Oracle のストアド プロシージャを呼び出していますが、FireDAC ではストアド プロシージャ名に必ずスキーマ名が付けられてしまいます。 どうすれば回避できるでしょうか。

A: FireDAC には、MetaCurCatalog および MetaCurSchema という 2 つの一般的な接続定義パラメータがあります。 DBMS によって異なりますが、片方または両方のパラメータがサポートされています(詳細については、「FireDAC データベース接続」を参照)。 これを '*' に設定すると、完全オブジェクト名の中の対応する名前の部分が使われなくなります。