このテクニカル ノートでは、DAO レコード フィールド エクス (チェンジ DFX) 機構について説明します。DFX ルーチンで起こっているを把握するには、 DFX_Text関数については、例として説明します。このテクニカル ノートへの情報の追加ソースとしては、単に、コードの他の個々 の DFX 関数調べることができます。おそらくカスタム DFX ルーチンとして頻繁にカスタム RFX ルーチン (ODBC データベース クラスを使用) する必要があります必要としません。
このテクニカル ノートが含まれています:
DFX の概要
DAO レコード フィールド交換メカニズム (DFX) を使用して取得およびCDaoRecordsetクラスを使用する場合のデータを更新する手順を簡略化します。プロセスは、 CDaoRecordsetクラスのデータ メンバーを使用して簡略化されます。CDaoRecordsetから派生することによって、テーブルまたはクエリ内の各フィールドを表す、派生クラスにデータ メンバーを追加できます。この「静的バインディング」メカニズム単純ですそれは、すべてのアプリケーションのデータのフェッチと更新法選択のできない場合があります。DFX は現在のレコードが変更されるたびにすべてのバインドされたフィールドを取得します。通貨を変更するとすべてのフィールドの取得を必要としない、パフォーマンス重視のアプリケーションを開発している場合は、「動的CDaoRecordset::GetFieldValue CDaoRecordset::SetFieldValue経由でバインディング」ことがあります、データ アクセス方法の選択。
注特価;ハイブリッド使用の静的および動的なバインディングを使用できるように DFX と動的バインド相互に排他的ではありません。(&N)。
例 1 - DAO レコード フィールド エクス チェンジだけを使用
( CDaoRecordset - 派生クラスを想定しています CMySet 既にを開く)
//[得意先] テーブルに新しいレコードを追加myset。AddNew();myset.m_strCustID = _T("MSFT");myset.m_strCustName = _T("Microsoft");myset。Update()
動的連結だけの 2 - 使用の例
( CDaoRecordsetクラスを使用して想定しています rs とそれが既に開いている)
//[得意先] テーブルに新しいレコードを追加COleVariantnbsp;varFieldValue1 (_T("MSFT")、VT_BSTRT);・ ・ メモ: 文字列型として ANSI、UNICODE の代わりに既定の VT_BSTRT のフラグCOleVariant varFieldValue2 (_T("Microsoft")、VT_BSTRT);rs。AddNew();rs。SetFieldValue(_T("Customer_ID")、varFieldValue1);rs。SetFieldValue(_T("Customer_Name")、varFieldValue2);rs。Update()(&N)
例 3 - DAO レコード フィールド エクス チェンジと動的バインドの使用
(参照の従業員データCDaoRecordsetを前提としています-派生クラス emp )
//表示することができますように、従業員のデータを取得します。emp。MoveNext();・ ユーザーが従業員の写真を見たい場合//取得COleVariant varPhoto;場合 (bSeePicture)emp。GetFieldValue(_T("photo")、varPhoto);・ データの表示PopUpEmployeeData (emp.m_strFirstName、emp.m_strLastName、varPhoto)
DFX 機構は、MFC ODBC クラスを使用、レコード フィールド エクス (チェンジ RFX) 機構と同様に動作します。DFX と RFX の原理は同じですが、内部相違が数多くあります。事実上すべてのコード、個々 の DFX ルーチンで共有されるように、DFX 関数のデザインだった。最上位の DFX が行うことをは。
DFX の中心にメカニズム、 CDaoRecordsetの派生クラスのDoFieldExchange関数です。この関数は、適切な操作の種類の個々 の DFX 関数の呼び出しをディスパッチします。内部の MFC DoFieldExchangeを呼び出す前に関数は、操作の種類を設定します。さまざまなの操作の種類と簡単な説明を次の一覧を示します。
| 操作 | 説明 |
| AddToParameterList | ビルド パラメーター句 |
| AddToSelectList | ビルド SELECT 句 |
| BindField | バインド構造体を設定します。 |
| BindParam | パラメーターの値を設定します |
| フィックス アップ | NULL 状態を設定します |
| AllocCache | ダーティのチェックのキャッシュを割り当てます |
| StoreField | 現在のレコードをキャッシュに保存. します。 |
| LoadField | メンバーの値に復元キャッシュ |
| FreeCache | キャッシュを解放します。 |
| SetFieldNull | フィールドの設定状態 amp;値を NULL に(&A) |
| MarkForAddNew | ダーティ フィールド場合は擬似 NULL をマークします。 |
| MarkForEdit | キャッシュに一致しないマーク フィールド汚れた場合 |
| SetDirtyField | フィールドの設定値がダーティとマーク |
次のセクションでは、各操作で詳しくDFX_Textについて説明します。
DAO レコード フィールド交換プロセスについて理解する最も重要な機能は、 ICDaoRecordsetオブジェクトのGetRows関数を使用することです。DAO GetRows関数は、いくつかの方法で作業することができます。このテクニカル ノートの範囲の外でこのテクニカル ノートのみGetRows説明します。
DAO GetRowsはいくつかの方法で作業することができます。
DFX 関数が実装されて、最も重要な操作、必要なデータ構造をGetRowsを正常に呼び出すに設定する必要がありますこの議論から明白であります。DFX 関数がサポートする必要がありますも、その他の操作の数がどれも重要なものGetRowsを正しく準備として複雑な呼び出し。
DFX の使用、オンライン ドキュメントで説明します。基本的に、2 の要件があります。最初、メンバー、 CDaoRecordsetの派生クラス各連結フィールドのパラメーターを追加する必要があります。次のこのCDaoRecordset::DoFieldExchangeをオーバーライドする必要があります。メンバーのデータ型が重要であることに注意してください。データベースのフィールドからのデータに一致するか、少なくともその型に convertable します。たとえば、数値のフィールドを長整数などのデータベースのことができます常にテキストに変換して、 CStringのメンバーには、バインドしますが、テキスト フィールドに、データベース可能性があります必ずしも長整数型などの数値表現に変換し、長整数メンバーをバインドします。DAO と、Jet データベース エンジンは、変換 (なく MFC) 責任があります。
おそらく以前述べたように、DFX のしくみを説明する最良の方法は、例を簡単にです。この目的のため、 DFX_Textの内部を行く非常によく少なくとも DFX の基本的な理解を提供するために作業する必要があります。
AddToParameterList
この操作は、SQLパラメーター句を構築 (「 Parameters lt;param name>, <param type> ... ; 」) による噴流に必要な。各パラメーターは名前し、(RFX 呼び出しで指定された) として型指定されました。関数の個々 の種類の名前を表示するには、 CDaoFieldExchange::AppendParamType関数を参照してください。DFX_Textの場合、使用するタイプです。text。
AddToSelectList
SQL選択句を作成します。これはかなりまっすぐ進む、DFX 呼び出しで指定された列名は、追加されます (" SELECT lt;column name>, ... ")。
BindField
-これまでで最も複雑な操作。これはGetRowsで使用される DAO バインド構造をセットアップは前述のよう。構造内の情報の種類にDFX_Textのコードから参照することができます使用される DAO 型 (DAO_CHARまたはDAO_WCHAR DFX_Textの場合) が含まれます。さらに、使用されるバインディングの種類も設定されます。前のセクションでGetRowsは簡単に説明されたものの、MFC によって使用されるバインディングの種類を常に直接アドレス バインディング (DAOBINDING_DIRECT) 説明するのに十分だった。MFC、メモリの割り当てを制御、正しい長さのアドレスを指定することができますさらに可変長列のバインド ( DFX_Text) のようなコールバック連結使用されます。この意味は、MFC です常に DAO」、「したがってメンバー変数に直接バインドをできるようにデータを配置する伝えることができます。連結構造体の残りのメモリ割り当てコールバック関数と列のバインド (列名による連結) の種類のアドレスのようなものでいっぱいです。
BindParam
これは、パラメーター メンバーで指定されたパラメーターの値をSetParamValueを呼び出す簡単な操作です。
フィックス アップ
各フィールドのNULL状態での塗りつぶし。
SetFieldNull
この操作のみ各フィールドの状態としてNULLをマークし、メンバー変数の値にな PSEUDO_。
SetDirtyField
呼び出しSetFieldValueの各フィールドをダーティとしてマーク。
すべての残りの操作は、データ キャッシュを使用して対処します。データ キャッシュは、特定の物事を簡単にするために使用される、現在のレコード内のデータの余分なバッファーです。例えば「ダーティ」フィールドが自動的に検出することができます。オンライン マニュアルの説明に従って、完全にまたはフィールド レベルで無効にできます。バッファーの実装は、マップを使用します。このマップを動的に割り当てられたデータのコピーを「バインド」フィールド (またはCDaoRecordset derieved データ メンバー) のアドレスと一致するために使用します。
AllocCache
動的にキャッシュされたフィールド値を割り当て、それをマップに追加します。
FreeCache
キャッシュされたフィールド値を削除し、それをマップから削除します。
StoreField
現在のフィールド値をデータ キャッシュにコピーします。
LoadField
キャッシュされた値は、フィールド メンバーにコピーします。
MarkForAddNew
現在のフィールドの値がないかどうかチェック-NULLと、汚れたに応じてマーク。
MarkForEdit
データ キャッシュでの現在のフィールドの値を比較し、必要な場合は、ダーティ マーク。
ヒント特価;既存の DFX ルーチンの標準データ型、カスタム DFX ルーチンをモデルします。(&N)。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)