テクニカル ノート 55: MFC ODBC データベース クラス アプリケーションの MFC DAO クラスへの移行
[!メモ]
Visual C++ .NET では、Visual C++ 開発環境およびウィザードでは DAO はサポートされなくなりました (DAO クラスは含まれているので、このクラスを使うことはできます)。Microsoft は、新しいプロジェクトに OLE DB テンプレート か ODBC と MFC を使用することをお勧めします。DAO は、既存のアプリケーションを保守するためだけに使用してください。
概要
MFC の DAO データベース クラスに MFC ODBC データベース クラスを使用するアプリケーションを移行すると、多くの場合、望ましいこともあります。このテクニカル ノートは、 MFC ODBC クラスと MFC DAO クラス間の相違点のほとんどを示します。確認の違いによって、 ODBC クラスから MFC 必要な場合にアプリケーションを移行するとカテゴリに分類して過度に困難ではありません。
理由 ODBC から DAO に移行します。
理由 ODBC データベース クラスから DAO データベース クラスにアプリケーションを移行する場合がありますが、デシジョンは、単純または明確ではありません。または、いくつかの原因があります。注意する次の 1 点は DAO で使用される Microsoft Jet データベース エンジンが、 ODBC ドライバーを持つ ODBC データ ソースを読み取ることができることです。ODBC データベース クラスを使用するか、 ODBC 直接ダイヤルすることにより、をより効率的である、 Microsoft Jet データベース エンジンは ODBC データを読み込むことができます。
ODBC/DAO のデシジョンを簡単にする、簡単なケース。たとえば、 Microsoft Jet のエンジンが DAO データベース クラスを使用することです (アクセス フォーム、 Excel のフォームなど)をマニフェストの選択を直接読み取ることができるフォームでのみデータへのアクセスを必要とする場合。
より複雑な場合はデータがサーバーまたはさまざまな異なるサーバー上にある場合に発生します。この場合、 ODBC データベースを使用するデシジョン、クラス、または DAO データベース クラスが困難な 1 です。異なる結合 (SQL Server、 Oracle など、複数の書式のサーバーからのデータ バインディング)などの操作を実行する場合、 ODBC データベース クラスを使用するか、 ODBC を直接呼び出した場合、 Microsoft Jet データベース エンジンは必要な作業をしてではなく、のバインディングを実行します。ドライバー カーソルをサポートする ODBC ドライバーを使用すると、最も適しているのは ODBC データベース クラスである場合があります。
選択が複雑になる可能性があるため、特別な必要がある各メソッドのパフォーマンスをテストするサンプル コードを記述する場合があります。このテクニカル ノートは ODBC データベース クラスから DAO データベース クラスに移行するデシジョンがあると仮定します。
ODBC データベース クラスと MFC DAO データベース クラス間の類似性
MFC ODBC クラスの元のデザインは、 Microsoft Access と、 Microsoft Visual Basic で使用されている DAO のオブジェクト モデルに基づいて。これは、ここで示したすべての MFC DAO クラスあることを意味し、 ODBC の多くの共通機能が。一般に、プログラミング モデルは同じです。
いくつかの類似性を強調表示する:
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_Date * |
DFX_Date (ベースのCOleDateTime) |
RFX_Text |
DFX_Text |
RFX_Binary |
DFX_Binary |
RFX_LongBinary |
DFX_LongBinary |
RFX_Date の関数は CTime と TIMESTAMP_STRUCTに基づいています。
アプリケーションに影響する可能性が、必要な簡易名新旧の詳細を機能に重大な変更を次に示します。
レコードセットなどの操作を指定するために使用される定数とマクロは型を開き、レコードセットを利用できるオプションが変更されました。
ODBC によってマクロまたは列挙型によってこれらのオプションを定義するために必要な MFC を使用します。
DAO クラスによって、 DAO はヘッダー ファイル (DBDAOINT.H)のこれらのオプションの定義を提供します。したがって、レコードセットの型は CRecordsetの列挙メンバーですが、 DAO と、代わりに定数です。たとえば CDaoRecordsetの種類を指定した場合 CRecordset の種類を ODBC DB_OPEN_SNAPSHOT で指定した場合 snapshot を使用します。
CRecordset の既定のレコードセットの型は CDaoRecordset の既定のレコードセットの型が dynaset の間、 snapshot です (ODBC クラスのスナップショットに関する追加の問題については次メモを参照)。
ODBC CRecordset のクラスに前方スクロール専用レコードセットの型を作成できます。前方スクロール専用 CDaoRecordset のクラスでは、レコードセット特定の種類のないレコードセットを入力しないで、プロパティ (またはオプション)です。
レコードセットのデータが読み込まれ、追加できることを CRecordset のオブジェクトを開くことが意図したときにのみ追加レコードセット。CDaoRecordset のオブジェクトによって、追加のみオプションは、レコードセットのデータが追加されるだけですができることを正確になり、 (読み取るため)。
ODBC クラスのトランザクションのメンバー関数は CDatabase のメンバーで、データベース レベルで機能します。DAO クラスでは、トランザクションのメンバー関数は、高レベルのクラス (CDaoWorkspace)のメンバーで、同じトランザクション ワークスペース (区分)を共有する CDaoDatabase の複数のオブジェクトに影響する場合があります。
例外クラスが変更されました。CDBExceptions は DAO クラスと ODBC クラス CDaoExceptions にスローされます。
RFX_Date は DFX_Date が COleDateTimeを使用すると、 CTime と TIMESTAMP_STRUCT のオブジェクトを使用します。COleDateTime は CTimeと同じですが、 8 バイト OLE 日付,DATE に 4 バイト time_t ではなく基づいているため、データのより大きい範囲を保留できます。
[!メモ]
DAO (CDaoRecordset)のスナップショットは、 ODBC (CRecordset)のスナップショットが ODBC カーソル ライブラリのドライバーと使用して更新する場合でも、読み取り専用です。カーソル ライブラリを使用すると、 CRecordset のスナップショットは更新可能になります。ODBC カーソル ライブラリなしでのデスクトップ ドライバー Pack 3.0 での Microsoft ドライバー使用すると、 CRecordset のスナップショットは読み取り専用です。別のドライバーを使用している場合は、スナップショット ()。STATIC_CURSORSが読み取り専用かどうかドライバーのドキュメントを確認します。