テクニカル ノート 55: MFC ODBC データベース クラス アプリケーションの MFC DAO クラスへの移行
注意
Visual C++ .NET では、Visual C++ 開発環境およびウィザードでは DAO はサポートされなくなりました (DAO クラスは含まれているので、このクラスを使うことはできます)。 新規プロジェクトの作成には、OLE DB テンプレートまたは ODBC および MFC の使用をお勧めします。 DAO は、既存のアプリケーションを保守するためだけに使用してください。
概要
MFC (Microsoft Foundation Class) の ODBC データベース クラスを使用するアプリケーションを MFC の DAO データベース クラスに移行することが望ましい状況が考えられます。 ここでは、MFC の ODBC クラスと DAO クラスの違いについて詳しく説明します。 相違点を念頭に置くことで、アプリケーションの ODBC クラスから MFC クラスへの移行がさほど困難ではなくなります。
ODBC から DAO へ移行する理由
アプリケーションを ODBC データベース クラスから DAO データベース クラスへ移行するにはさまざまな理由が考えられますが、必ずしも単純で明白な意志決定ができるとは限りません。 念頭に置くべきことは、DAO で使用される Microsoft Jet データベース エンジンは、ODBC ドライバーがあれば、どのような ODBC データ ソースでも読むことができるということです。 アプリケーションで ODBC データベース クラスを使用したり、ODBC を直接呼び出したりする方が効率的な場合もありますが、Microsoft Jet データベース エンジンを使用すると ODBC データを読むことができます。
ODBC か DAO かの意志決定を簡単に下せるような単純な場合もあります。 たとえば、Microsoft Jet エンジンが直接読める形式 (Access 形式、Excel 形式など) のデータにだけアクセスする必要のある場合は、DAO データベース クラスを選択します。
しかし、データがサーバー上またはさまざまなサーバー上にある場合は、複雑な状況が生じます。 その場合、ODBC データベース クラスと DAO データベース クラスのいずれを使用するか選択することは難しくなります。 異種結合 (SQL Server と Oracle のようにフォーマットが異なるサーバーどうしのデータ結合) を行う必要がある場合は、Microsoft Jet データベース エンジンによって結合が実行されるため、ODBC データベース クラスを使用したり、ODBC を直接呼び出したりする必要はありません。 ドライバー カーソルをサポートする ODBC ドライバーを使用する場合は、ODBC データベース クラスを採用するのが最善の方法です。
このように、ODBC か DAO かを選択することは難しいため、特殊な要件がある場合はサンプル コードを作成し、いくつかの方法でパフォーマンスをテストしてみるとよいでしょう。 このテクニカル ノートでは、ODBC データベース クラスから DAO データベース クラスに移行することが決定されているものとします。
ODBC データベース クラスと MFC DAO データベース クラスとの類似点
MFC ODBC クラスは、Microsoft Access と Microsoft Visual Basic で採用された DAO オブジェクト モデルを元にデザインされました。 このことは、ODBC クラスと DAO MFC クラスには、ここで取り上げる以外にも共通の機能が多数あることを意味します。 両者のプログラミング モデルはほぼ同じです。
注目すべき類似点は次のとおりです。
ODBC クラスと DAO クラスのいずれにも、基盤となるデータベース管理システム (DBMS: Database Management System) を使用して管理するようなデータベース オブジェクトがあります。
いずれにも、DBMS が返した結果を表すレコードセット オブジェクトがあります。
DAO データベース オブジェクトとレコードセット オブジェクトのメンバーは ODBC クラスのメンバーとほとんど同一です。
両方のクラスの集合について、データを検索するコードは、いくつかのオブジェクト名とメンバー名が変更されている点以外は同一です。 ODBC クラスから DAO クラスに移行するプロセスでは、多くの場合、単に名前を変更するだけで済みます。
たとえば、両方のモデルにおいてデータ検索の手続きは共通です。いずれの場合も、データベース オブジェクトを作成して開き、レコードセット オブジェクトを作成して開き、そして操作を実行してデータを検索および移動します。
ODBC クラスと DAO MFC クラスとの相違点
DAO クラスの方が多数のオブジェクトと豊富なメソッドを持っていますが、ここでは類似したクラスおよび機能における相違点についてのみ詳細に説明します。
おそらく、2 つのクラスの最も顕著な相違点は、類似したクラスとグローバル関数の名前が変更されていることです。 データベース クラスに関連するオブジェクト、メソッド、およびグローバル関数の名前の変更点を次の一覧に示します。
クラスまたは関数 |
対応する DAO クラスまたは関数 |
---|---|
CDatabase |
CDaoDatabase |
CDatabase::ExecuteSQL |
CDaoDatabase::Execute |
CRecordset |
CDaoRecordset |
CRecordset::GetDefaultConnect |
CDaoRecordset::GetDefaultDBName |
CFieldExchange |
CDaoFieldExchange |
RFX_Bool |
DFX_Bool |
RFX_Byte |
DFX_Byte |
RFX_Int |
DFX_Short |
RFX_Long |
DFX_Long |
|
DFX_Currency |
RFX_Single |
DFX_Single |
RFX_Double |
DFX_Double |
RFX_Date* |
DFX_Date (COleDateTime がベース) |
RFX_Text |
DFX_Text |
RFX_Binary |
DFX_Binary |
RFX_LongBinary |
DFX_LongBinary |
* RFX_Date 関数は CTime と TIMESTAMP_STRUCT をベースとする。
アプリケーションに影響する可能性や、単に名前を変更する以上の作業が必要となる可能性がある主な変更点は次のとおりです。
レコードセットのオープン タイプとオープン オプションなどを指定するための定数とマクロが変更されました。
ODBC クラスでは、これらのオプションは MFC でマクロか列挙型を使って定義する必要がありました。
DAO クラスでは、これらのオプションはヘッダー ファイル (DBDAOINT.H) で定義します。 つまり、レコードセットの型は CRecordset の列挙型のメンバーですが、DAO では定数になります。 たとえば、ODBC で CRecordset の型を指定するときは snapshot を使用しますが、CDaoRecordset の型を指定するときは DB_OPEN_SNAPSHOT を使用します。
CRecordset の既定のレコードセット型は snapshot ですが、CDaoRecordset の既定のレコードセット型は dynaset です。ODBC クラスのスナップショットの詳細については、後の「メモ」を参照してください。
ODBC の CRecordset クラスには、前方スクロール専用のレコードセット型を作成するためのオプションがあります。 CDaoRecordset クラスでは、前方スクロール専用はレコードセットの型ではなく、特定のレコードセットの型のプロパティ (またはオプション) です。
CRecordset オブジェクトのレコードセットを追加専用で開くと、レコードセットのデータの読み取りと追加が可能です。 CDaoRecordset オブジェクトでは、追加専用オプションを指定すると、文字どおりレコードセットのデータを追加できますが、読み取ることはできません。
ODBC クラスのトランザクション メンバー関数は CDatabase のメンバーであり、データベース レベルで動作します。 DAO クラスにおけるトランザクション メンバー関数は、より高レベルのクラス (CDaoWorkspace) のメンバーであるため、同じトランザクション ワークスペースを共有する複数の CDaoDatabase オブジェクトに影響します。
例外クラスが変更されました。 ODBC クラスでは CDBExceptions、DAO クラスでは CDaoExceptions がスローされます。
RFX_Date は CTime オブジェクトと TIMESTAMP_STRUCT オブジェクトを使用しますが、DFX_Date は COleDateTime を使用します。 COleDateTime は CTime とほとんど同じですが、4 バイトの time_t ではなく 8 バイトの OLE の DATE をベースとしているため、より大きなデータを保持できます。
注意
DAO (CDaoRecordset) のスナップショットが読み取り専用であるのに対して、ODBC (CRecordset) のスナップショットは、ドライバーに応じて、または ODBC カーソル ライブラリを使用することによって更新できます。 カーソル ライブラリを使用している場合は、CRecordset スナップショットを更新できます。 ODBC カーソル ライブラリを使用せずに Desktop Driver Pack 3.0 の任意の Microsoft ドライバーを使用する場合は、CRecordset のスナップショットは読み取り専用になります。 それ以外のドライバーを使用する場合、スナップショット (STATIC_CURSORS) が読み取り専用になるかどうかは、ドライバーのドキュメントを参照してください。