このノートでは、レコード フィールド エクス (チェンジ RFX) アーキテクチャについて説明します。それも、 rfx _プロシージャを記述する方法について説明します。
レコード フィールド エクス チェンジの概要
すべてのレコード セット フィールド関数は、C++ コードで行われます。特別なリソースや魔法のマクロはありません。機構の中心は、すべての派生レコード セット クラスでオーバーライドする必要があります、仮想関数です。それは、常にこのフォームで見つからない:
void CMySet::DoFieldExchange (CFieldExchange ※ pFX){//{{AFX_FIELD_MAP(CMySet)lt; レコード セット exchange フィールド タイプのコール >< レコード セット exchange 機能呼び出し >//}}AFX_FIELD_MAP}
特殊な形式の AFX コメントを検索し、この関数内のコードを編集するには、ClassWizard を許可します。ClassWizard と互換性のないコードは特殊コメント外の配置。
上記の例では、lt; recordset_exchange_field_type_call > 形式です:
pFX gt;SetFieldType(CFieldExchange::outputColumn)(&G)
lt; recordset_exchange_function_call > 形式です:
RFX_Custom (pFX、"Col2"、m_Col2)
ほとんどのrfx _関数の 3 つがある、上記のような引数がいくつか ( RFX_TextやRFX_Binaryなど) がある追加のオプションの引数。
1 つ以上のrfx _各DoDataExchange関数に含まれる可能性があります。
MFC が提供すべてのレコード フィールド交換ルーチンの一覧 ' afxdb.h' を参照してください。
レコード セット フィールドの呼び出しCMySetクラスのフィールド データを格納するメモリの場所 (通常はデータ メンバー) を登録するための方法です。
メモ
レコード セット フィールド関数は、 CRecordsetクラスでのみ動作するように設計されています。彼らは他の MFC クラスで一般的に使用可能ではありません。
データの初期値が標準の C++ コンス トラクター ブロックを通常の設定 //{{AFX_FIELD_INIT(CMylSet)
と //}}AFX_FIELD_INIT
のコメント。
各rfx _関数がダーティ状態のフィールドを返すフィールド、フィールドを編集するための準備でのアーカイブに至るまで、さまざまな操作をサポートする必要があります。
DoFieldExchange (たとえばSetFieldNull、 IsFieldDirty) を呼び出す各関数は独自の初期化呼び出しDoFieldExchangeを回避。
どのように動作します。?
レコード フィールド エクス チェンジを使用するために、以下を理解する必要はありません。しかし、このシーンの背後にある作品は、あなたを助ける理解書き込み独自の交換手順。
DoFieldExchangeメンバー関数Serializeメンバー関数は - それを取得、クラスのメンバー データにデータを設定、外部フォーム (このケースの列は、ODBC クエリの結果から) から責任を負います。PFXパラメーターは、データ交換を行うためで cobject::serializeをCArchiveパラメーターに似ています。PFX ( CFieldExchangeオブジェクト) と同様ですが、汎化、 CArchive方向のフラグ操作インジケーターがあります。RFX 関数は、次の操作をサポートする必要があります。
ユーザーの拡張機能
既定の RFX 機構を拡張するには、数とおりの方法があります。できます
Cbookmark クラス
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,特価;BIGINT & 値)(&N)
中 (posExtraFields! = NULL){特価;RFX_Text (pFX、m_listName.GetNext(posExtraFields)、m_listValue.GetNext(posExtraValues));}(&N)
注特価;このようなコード ClassWizard で編集することはできず、特別なコメントの外を使用する必要があります。(&N)。
カスタム RFX を書く
独自のカスタム RFX 関数を記述するには、既存の RFX 関数をコピーしてあなた自身の目的のために変更することをお勧めします。コピーするには、右の RFX を選択あなたの仕事より簡単にすることができます。いくつかの RFX 関数は、コピー先を決定するときに考慮する必要がありますいくつかのユニークな特性があります。
動作を幅広くとに:
これらの簡単な RFX 関数です。どんな特別な解釈を必要としないデータ値とデータのサイズは固定です。
RFX_Single と RFX_Double:
動作を幅広くなどに、これらの関数は単純で、作ることができる広範囲の既定の実装を使用します。Dbflt.cpp dbrfx.cpp のではなくしかしときに、のみ明示的に参照はポイント ライブラリを浮動ランタイムの読み込みを有効にする格納されます。
RFX_Text と RFX_Binary:
これら 2 つの関数、文字列またはバイナリ情報を格納する静的バッファーして、これらのバッファーを ODBC SQLBindCol の代わりに登録する必要があります amp; 値。このため、これら 2 つの関数の特殊なコードがたくさんあります。(&A)。
RFX_Date:
ODBC 自分 TIMESTAMP_STRUCT のデータ構造での日付と時刻の情報を返します。この関数に動的に、TIMESTAMP_STRUCT を「プロキシ」として、日付時刻データの送受信に割り当てます。さまざまな操作の日付と時刻の情報は C++ CTimeオブジェクトと TIMESTAMP_STRUCT プロキシ間を転送する必要があります。言うまでもなく、これこの関数はかなり複雑になりますが、データ転送をプロキシを使用する方法の良い例です。
RFX_LongBinary:
これだけのクラス ライブラリ データを送受信するには、列のバインドを使用しない RFX 関数です。この関数は、BindFieldToColumn 操作は無視されますと代わりに、フィックス アップ操作中に、着信 SQL_LONGVARCHAR または SQL_LONGVARBINARY のデータを保持するストレージを割り当てますに割り当てられたストレージの値を取得するには、SQLGetData の呼び出しを実行します。データ値は、データ ソース (すなわち名前と値、値の操作) に戻る送信する際に、この関数は ODBC の DATA_AT_EXEC 機能を使用します。テクニカル ノート 45 SQL_LONGVARBINARY と SQL_LONGVARCHARs の操作の詳細についてを参照してください。
Rfx _関数を書くときに、多くの場合CFieldExchange::Defaultを使用して、特定の操作を実装することができますされます。既定の実装で問題の処理を見てみましょう。それをrfx _関数を書くことと、操作を実行する場合に委任することができます、 CFieldExchange::Default 。CFieldExchange::Default dbrfx.cpp の呼び出しの例を見ることができます。
それは、RFX 関数の開始時にIsFieldTypeを呼び出すし、FALSE を返すかどうかはすぐにリターンすることが重要です。このメカニズムでoutputColumns、( BindParam outputColumnを呼び出すように) が実行されてから、パラメーター操作を保持します。また、 IsFieldType自動的にoutputColumns (m_nFields) と params (m_nParams) の数の追跡。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)