dbExpress フレームワーク
Win32 プラットフォーム向けのデータベース アプリケーションの開発:インデックス への移動
dbExpress Framework(DBX Framework)は、DBXCommon ユニットに用意された一連の抽象クラスです。 アプリケーションは、このフレームワークといくつかの方法でやり取りできます。 つまり、ネイティブ アプリケーションとマネージ アプリケーションの双方で、このフレームワークを直接使用することもできますし、このフレームワークの上位レイヤに存在する dbExpress VCL コンポーネントを使用することもできます。
多くのアプリケーションでは dbExpress VCL コンポーネントを介して dbExpress ドライバとやり取りしますが、DBX フレームワークには、データベース ドライバと通信するための便利でより軽量な手段が用意されています。 また、フレームワークの DBXCommon 抽象基底クラスを拡張することで、dbExpress 用のデータベース ドライバを作成することもできます。 DBX フレームワークは、"集合" 指向データベース アプリケーションで最もよく必要とされるデータベース ドライバ機能を提供していますが、それでいて、用意されているインターフェイスはシンプルです。
DBX フレームワークの主要な特長をいくつか以下に紹介します。
- ドライバ フレームワークが完全に Delphi で記述されているため、ドライバを Delphi で記述することができます。
- ポインタではなく、厳密に型指定されたデータ アクセスを使用します。 たとえば、文字列のポインタではなく、文字列型を使用します。
- ドライバ フレームワークは単一ソース型です。 ソースをネイティブ DCC32 コンパイラでコンパイルできます。
- フレームワークには、ドライバ、接続、コマンド、リーダーなどに使用される抽象基底クラスのみ用意されています。
- フレームワークは、エラー コードを返すのではなく、例外ベースのエラー処理を行います。
機能
DBXCommon 内のクラスを拡張するドライバには、DBXDynaLink と DBXDirect の 2 つのカテゴリがあります。 これらのドライバは、読み込む方法とアプリケーションに提供する機能が異なります。 これらについては、後で詳しく説明します。
DBX フレームワークを拡張してデリゲート ドライバを作成することもできます。これは、アプリケーションと実際のドライバの間に介在する追加レイヤとなるものです。 デリゲート ドライバは、接続プール、ドライバ プロファイリング、追跡、および監査に役立ちます。 また、ドライバ デリゲートの適用例としては、スレッドセーフなデリゲート ドライバの作成も考えられます。 そのようなデリゲートがあれば、スレッドの同期を取ってすべての public メソッドにアクセスさせることができます。
スレッドの絶対的な安全性は、dbExpress を使用するアプリケーション側で確保する必要があります。 しかし、一部のスレッドの安全性の問題は、dbExpress フレームワークによって最善の形で処理されます。 dbExpress スレッド セーフ オペレーションには、ドライバの読み込みとアップロード、接続の作成などのためのものが含まれています。 既に述べたように、デリゲート ドライバを作成することで、dbExpress のパブリック インターフェイス全体を必要に応じてスレッドセーフにすることができます。
dbExpress ドライバは、Delphi パッケージとして作成されたドライバを静的または動的にリンクできます。 ドライバ パッケージをリンクする最も簡単な方法は、それをただ "uses" 句の中で指定することです。 また、ドライバ ローダーは、config ファイルまたは ini ファイルで指定されているパッケージを、LoadPackage メソッドを使って読み込みます。 これにより、アプリケーションの各ユニットの uses 句で指定されていないドライバを動的に読み込めるようになります。 なお、LoadPackage を用いる手法は、パッケージを使用するように作成されたアプリケーションにしか用いることができません。
dbExpress ドライバの作成者は、dbExpress に付属するソース コード内の DBXDynalink ユニットおよび DBXTrace ユニットの初期化セクションを調べる必要があります。 これらのセクションでは、自分自身を ClassRegistry というシングルトン ユニットに登録します。 ClassRegistry は、dbExpress ドライバ ローダーで名前(String 型)別にドライバ ローダー クラスをインスタンス化するのに使用されます。 ClassRegistry は、名前別にクラスを登録およびインスタンス化するためのシンプルかつ軽量なメカニズムです。
DBXDynalink ドライバ
DBXDynalink は、新規ドライバだけでなく、既存の dbExpress ドライバにも使用されます。 これは、ネイティブ Delphi パッケージとしてコンパイルされます。 DBXDynalink は、DBXExports という、よりプリミティブな "ネイティブ" インターフェイスを実装するネイティブ dbExpress ドライバを読み込みます。 DBXExports インターフェイスは、少数の "フラットな" エクスポート メソッドの集まりです。 DBXExports のソースは dbExpress に付属しています。 DBXExports に用意されている API は、dbExpress 3 の COM ベース インターフェイスよりも厳密に型指定されています。 これにより、DBXExports インターフェイスのこれまでの実装との互換性を損なうことなく、次世代の製品にメソッドを追加することができます。
DBXAdapter は、DBXExports インターフェイスをこれまでの dbExpress COM インターフェイスに適合させる dbExpress 準拠ドライバです。 DBXExports を直接実装することで、より新しいネイティブ ドライバを作成できます。
DBXExports インターフェイスは、任意のネイティブ言語(Delphi または C++)を使って実装するように設計されているため、よりプリミティブな非例外ベースのエラー処理を行います。 DBXDynalink は、エラー コードを DBXCommon 例外にマッピングします。
DBXDynalink ユニットには、dbExpress ドライバが含まれています。 このドライバは、フラットなエクスポート インターフェイス DBXDynalinkExport を実装する非 Delphi ドライバに処理を委譲します。 DBXTrace は、追跡に使用されるデリゲート ドライバです。 dbExpress VCL では、DBXCommon、DBXDynalink、および DBXTrace を "デフォルト" ドライバとして使用します。 ただし、静的にリンクされるアプリケーションの場合は、dbExpress VCL ソース コード(SQLExpr.pas)を変更せずに、この動作を変更できます。 SQLExpr.pas では、DBXDefaultDrivers ユニットを使用します。 DBXDefaultDrivers ユニットには uses 句のみ記述されています。 DBXDefaultDrivers の uses 句には、DBXCommon、DBXDynalink、および DBXTrace が指定されています。 DBXCommon は必ず使用する必要があります。 ただし、静的にリンクされるアプリケーションでは、DBXTrace を削除したり、DBXDynalink を別のドライバに置き換えることができます。
DBXDirect ドライバ
DBXDirect ドライバは、DBXCommon の抽象基底クラスを拡張することで実装されるドライバです。 ネイティブ実装の場合は、これらのクラスを Delphi で作成します。
厳密に言えば、DBX フレームワーク ドライバはすべて、一種の DBXDirect ドライバです。 ただし、DBXDynalink と DBXRemote の場合、ドライバ実装へのリンクはより "間接的" です。