次の方法で共有


TN055: MFC ODBC データベース クラス アプリケーションを MFC DAO クラスに移行する

DAO は Access データベースで使用され、Office 2013 でサポートされています。 DAO 3.6 は最終バージョンであり、古いと見なされます。 Visual C++ 環境とウィザードは DAO をサポートしていません (ただし、DAO クラスは含まれており、引き続き使用できます)。 新しいプロジェクトには 、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 などの複数の形式のサーバーからのデータを結合する) などを行う場合は、ODBC データベース クラスを使用するか、ODBC を直接呼び出した場合に必要な作業を強制するのではなく、Microsoft Jet データベース エンジンによって結合が実行されます。 ドライバー カーソルをサポートする 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を使用しますが、CDaoRecordsetの種類を指定するときにDB_OPEN_SNAPSHOTします。

  • CRecordsetの既定のレコードセットの種類はスナップショットですが、CDaoRecordsetの既定のレコードセットの種類はダイナセットです (ODBC クラス スナップショットに関するその他の問題については、以下の注を参照してください)。

  • ODBC CRecordset クラスには、前方専用レコードセット型を作成するオプションがあります。 CDaoRecordset クラスでは、前方専用はレコードセット型ではなく、特定の種類のレコードセットのプロパティ (またはオプション) です。

  • CRecordset オブジェクトを開くときの追加専用レコードセットは、レコードセットのデータを読み取って追加できることを意味します。 CDaoRecordsetオブジェクトの場合、append-only オプションは、レコードセットのデータを追加すること (および読み取りはできないこと) を意味します。

  • ODBC クラスのトランザクション メンバー関数は、 CDatabase のメンバーであり、データベース レベルで動作します。 DAO クラスでは、トランザクション メンバー関数は上位クラス (CDaoWorkspace) のメンバーであるため、同じワークスペース (トランザクション領域) を共有する複数の CDaoDatabase オブジェクトに影響を与える可能性があります。

  • 例外クラスが変更されました。 CDBExceptions は ODBC クラスでスローされ、CDaoExceptions は DAO クラスでスローされます。

  • RFX_DateCTime オブジェクトと TIMESTAMP_STRUCT オブジェクトを使用し、 DFX_DateCOleDateTimeを使用します。 COleDateTimeCTimeとほぼ同じですが、4 バイトのtime_tではなく 8 バイトの OLE DATE に基づいているため、はるかに広い範囲のデータを保持できます。

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

こちらも参照ください

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