次の方法で共有


テクニカル ノート 55: MFC ODBC データベース クラス アプリケーションの MFC DAO クラスへの移行

Note

DAO は、Access データベースで使用され、Office 2013 を介してサポートされています。 DAO 3.6 は最終バージョンであり、古いバージョンと見なされます。 Visual C++ 環境およびウィザードでは DAO はサポートされていません (ただし、DAO クラスは含まれており、引き続き使用できます)。 Microsoft は、新しいプロジェクトには OLE DB テンプレートまたは ODBC および MFC を使用することをお勧めします。 DAO は、既存のアプリケーションを保守するためにのみ使用してください。

概要

多くの状況では、MFC の ODBC データベース クラスを使用するアプリケーションを MFC の DAO データベース クラスに移行することが望ましい可能性があります。 このテクニカル ノートでは、MFC ODBC クラスと DAO クラスの違いのほとんどについて詳しく説明します。 この違いを覚えておけば、必要に応じてアプリケーションを ODBC クラスから MFC クラスに移行することはそれほど難しくありません。

ODBC から DAO に移行する理由

アプリケーションを ODBC データベース クラスから DAO データベース クラスに移行する理由はいくつかありますが、その決定は必ずしも単純または明白なものではありません。 覚えておくべきことの 1 つは、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 データベース クラスと MFC DAO データベース クラスの類似点

MFC ODBC クラスの元の設計は、Microsoft Access および Microsoft Visual Basic で使用されている DAO オブジェクト モデルに基づいていました。 これは、ODBC クラスと DAO MFC クラスに共通する機能が多数あることを意味します。ただし、このセクションではその一覧をすべて示すことはしません。 大まかには、これらのプログラミング モデルは同じです。

いくつかの類似点を示します。

  • ODBC クラスと DAO クラスのどちらにも、基盤となるデータベース管理システム (DBMS) を使用して管理するデータベース オブジェクトがあります。

  • どちらにも、その DBMS から返される結果のセットを表すレコードセット オブジェクトあります。

  • DAO データベースおよびレコードセット オブジェクトには、ODBC クラスとほぼ同じメンバーがあります。

  • クラスの両方のセットで、データを取得するコードは、一部のオブジェクト名とメンバー名の変更を除いて同じです。 変更が必要になりますが、通常、ODBC クラスから DAO クラスに切り替える場合、そのプロセスは簡単な名前の変更です。

たとえば、どちらのモデルでも、データを取得するには、データベース オブジェクトを作成して開いた後、レコードセット オブジェクトを作成して開き、何かの操作を実行しているデータをナビゲート (移動) する、という手順を実行します。

ODBC クラスと DAO MFC クラスの相違点

オブジェクトとメソッドのセットは DAO クラスにより多く含まれていますが、このセクションでは、類似するクラスと機能における相違点のみを詳しく説明します。

おそらく、これらのクラス間の最も明白な違いは、類似するクラスとグローバル関数の名前の変更です。 次の一覧は、データベース クラスに関連付けられているオブジェクト、メソッド、およびグローバル関数の名前の変更を示しています。

クラスまたは関数 MFC 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_Date1 DFX_Date (COleDateTime ベース)
RFX_Text DFX_Text
RFX_Binary DFX_Binary
RFX_LongBinary DFX_LongBinary

1RFX_Date 関数は、CTimeTIMESTAMP_STRUCT に基づいています。

アプリケーションに影響を与える可能性があり、単純な名前の変更以上の作業が必要になる機能の主な変更点を以下に示します。

  • レコードセットのオープン型やレコードセットのオープン オプションなどを指定するために使用される定数とマクロが変更されました。

    ODBC クラスの場合、MFC でマクロまたは列挙型を介してこれらのオプションを定義する必要がありました。

    DAO クラスの場合、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 に基づいているため、はるかに広い範囲のデータを保持できます。

    Note

    DAO (CDaoRecordset) スナップショットは読み取り専用ですが、ODBC (CRecordset) スナップショットは、ドライバーと ODBC カーソル ライブラリの使用状況によっては更新可能である場合があります。 カーソル ライブラリを使用している場合、CRecordset スナップショットは更新可能です。 ODBC カーソル ライブラリなしで Desktop Driver Pack 3.0 の Microsoft ドライバーのいずれかを使用している場合、CRecordset スナップショットは読み取り専用です。 別のドライバーを使用している場合は、ドライバーのドキュメントを確認して、スナップショット (STATIC_CURSORS) が読み取り専用かどうかを確認してください。

関連項目

番号順テクニカル ノート
カテゴリ別テクニカル ノート