Firebird サーバーおよび Interbase サーバーに関する質問(FireDAC)

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

FAQ(FireDAC) への移動


このトピックでは、Firebird および Interbase のサーバーに関する質問と回答の一覧を掲載しています。

Q1: fbclient.dll の DLL パス名をセットアップするにはどうすればよいでしょうか。

A: 一般的な方法は「ドライバの構成」で説明しています。 アプリケーションごとに実行時に DLL を構成する手順は以下のとおりです。

設計時にも DLL を構成するつもりであれば、FDDrivers.ini にも次のように設定する必要があります。

[FB]
VendorLib=C:\Program Files\Firebird 2.5\bin\fbclient.dll

Q2: Firebird 2.5 ではどの DriverName を使用すればよいでしょうか。 IB または FB21 か、それとも他のものでしょうか。

A: FB は "基底" ドライバ ID です。 FB21 は "仮想" ドライバ ID です。 仮想ドライバは、ファイル FDDrivers.ini 内で構成されています。 このファイルを見ると、FB21 がどのように構成されているかがわかります。 これは、適切な fbclient.dll を使用するよう FB 基底ドライバを構成したものです。 自分で独自の仮想ドライバを作成することができます。 例:

[Firebird25]
BaseDriverID=FB
VendorLib=C:\Program Files\Firebird 2.5\bin\fbclient.dll

Q3: あるフィールドを FireDAC に論理値と認識させるにはどうすればよいでしょうか。

A: 論理値フィールドはドメインを使って作成することができます。 ドメイン名には 'BOOL' というサブ文字列を含まなければなりません。 また、接続定義に ExtendedMetadata=True というパラメータを追加します。 例:

CREATE DOMAIN T_BOOLEAN SMALLINT;
CREATE TABLE ... (
...
BOOLEAN_FIELD T_BOOLEAN,
...);

Q4: あるフィールドを FireDAC に GUID と認識させるにはどうすればよいでしょうか。

A: GUID フィールドはドメインを使って作成することができます。 ドメイン名には 'GUID' というサブ文字列を含まなければなりません。 また、接続定義に ExtendedMetadata=True というパラメータを追加します。 例:

CREATE DOMAIN T_GUID AS CHAR(16) CHARACTER SET OCTETS COLLATE OCTETS;
CREATE TABLE ... (
...
GUID_FIELD T_GUID,
...);

Q5: SQL を使って Firebird データベースを削除することはできますか。

A: DROP DATABASE コマンドは FB SQL コマンドではなく ISQL コマンドなので、TFDQuery で削除することはできません。 その代わりに、接続定義パラメータに DropDatabase=Yes を指定するか、TFDQuery で DROP DATABASE コマンドを使用してください。

Q6: Firebird でユーザー パスワードを変更するにはどうすればよいでしょうか。

A: FireDAC では、Firebird 2.5(および Oracle、MySQL、PostgreSQL、SQL Server、SQLite ドライバ)でのパスワード変更をサポートしています。次のようなコードを使用します。

FDConnection1.Connected := True;
FDConnection1.ConnectionIntf.ChangePassword('new password');

Q7: データベースを読み取り専用にするにはどうすればよいでしょうか。

A: 接続定義パラメータに次のように指定します。

IBAdvanced=set_db_readonly=1

Q8: Firebird で AutoCommit が正しく動作するのは FetchOptions.Mode = fmAll の場合だけで、他のときにはまったく動かないようです。 実際に AutoCommit がどのように動作するかを説明してください。

A: COMMIT を行うと、そのトランザクション内で開いているすべてのカーソルが無効になります。 FireDAC では、以下のルールで自動的にトランザクションを処理します。

  • コマンドが準備されていて、アクティブなトランザクションがなければ、コマンドは開始します。
  • Commit メソッドを明示的に呼び出した場合には、トランザクション内で開かれているすべてのデータベースがオフライン状態になります(FetchAll と、閉じて準備解除する処理が行われますが、その対象はコマンドだけで、データベース自体は含まれません)。
  • トランザクションにアクティブなカーソルが 1 つしか存在しなければ、そのカーソルから最後のレコードを取得した後、自動コミットが行われます(オプションで指定されている場合)。
  • トランザクションにアクティブなカーソルがなければ、コマンドを実行した後(ExecSQL)、トランザクションは自動コミットされます(オプションで指定されている場合)。

細かい違いはまだありますが、主なルールは上記のとおりです。

自動コミットが行われるのは、最後のレコードの取得が済んだ後です。 この動作は変更できないため、Open の直後に FetchAll が行われ、それから Commit が行われます。 fmOnDemand の場合と fmAll の場合とで違いはありません。

データセットからすべてのレコードを取得していないけれども、変更してデータベースにポストしたデータセット レコードを他のセッションから見えるようにするには、2 つ目の更新トランザクション オブジェクトを使用します。 つまり、カーソル トランザクションはアクティブなままにしておいて、更新を別の短時間トランザクションで実行します。 そうすれば、変更が他のユーザーから見えるようになります。

Q9: エイリアスを使って接続するにはどうすればよいでしょうか。

A: Protocol パラメータを空の文字列に設定するか、そもそも指定しないでください。

Q10: "[FireDAC][Phys][FB]connection rejected by remote interface"([FireDAC][Phys][FB]接続がリモート インターフェイスによって拒否されました)とはどういう意味ですか。

A: おそらく、GDS32.DLL を使って FB ドライバで Firebird サーバーに接続したものと思われます。

Q11: "Assertion failure (FireDAC.Phys.IBWrapper.pas, line 2052)"(アサーションに失敗しました: FireDAC.Phys.IBWrapper.pas、2052 行目)とはどういう意味ですか。

A: おそらく、FBCLIENT.DLL を使って IB ドライバで Interbase サーバーに接続したものと思われます。

Q12: FB Embedded の "no permission for read/select access to TABLE"(テーブルに読み取り/検索アクセスする権限がありません)とはどういう意味ですか。

A: Embedded サーバーではセキュリティ データベースを使用しませんが、ユーザー名による権限の確認は行われます。 ユーザー名が指定されていないか、指定が間違っている場合に、このエラーが発生します。