テクニカル ノート 43: RFX ルーチン
[!メモ]
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。
ここでは、レコード フィールド エクスチェンジ (RFX)アーキテクチャについて説明します。また、 RFX_ プロシージャを記述する方法について説明します。
レコード フィールド エクスチェンジの概要
すべてのレコードセット フィールドの関数は C++ コードで実行されます。特別なリソースまたは魔法のマクロはありません。機能の中核は派生レコードセット クラスでオーバーライドする必要がある仮想関数です。これは、このフォームに常にあります:
void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CMySet)
<recordset exchange field type call>
<recordset exchange function call>
//}}AFX_FIELD_MAP
}
特殊な形式 AFX の注釈は ClassWizard が、この関数内のコードを探し、編集できるようにします。コードを特殊な形式の注釈の外部に ClassWizard と互換性のある配置する必要がない。
上の例では、 <recordset_exchange_field_type_call> は、フォームにです:
pFX->SetFieldType(CFieldExchange::outputColumn);
と <recordset_exchange_function_call> は、フォームにです:
RFX_Custom(pFX, "Col2", m_Col2);
RFX_ のほとんどの関数は、上記のように、 3 種類の引数、一部があります (たとえば。RFX_Text と RFX_Binaryに追加)省略可能な引数があります。
複数の RFX_ は DoDataExchange の各関数に含まれる場合があります。
" MFC に用意されているすべてのレコードセット フィールド エクスチェンジ ルーチンの一覧の afxdb.h を参照してください。
レコードセット フィールドの呼び出しは CMySet のクラスのフィールド データを格納するメモリ位置 (通常はデータ メンバー)を登録する方法です。
説明
レコードセット フィールドの関数は CRecordset のクラスを使用するように設計されています。これらは一般に他の MFC クラスで使用できなくなります。
データの初期値は //{{AFX_FIELD_INIT(CMylSet) と //}}AFX_FIELD_INIT のコメント ブロックの標準 C++ のコンストラクターで、通常設定されます。
RFX_ の各関数は、フィールドの編集できるようにフィールドをアーカイブにフィールドのダーティなステータスを返すことからまたがるさまざまな操作をサポートする必要があります。
DoFieldExchange (たとえば SetFieldNull、 IsFieldDirty)をダイヤルする各関数は DoFieldExchangeに呼び出しの周囲に、独自のを初期化します。
このコードは、同様に機能しますか。
レコード フィールド エクスチェンジを使用するには、次を理解する必要はありません。ただし、これがどのように内部的に動作するかを理解することは、独自の交換プロシージャを作成する方法を説明します。
DoFieldExchange のメンバー関数は Serialize のメンバー関数と同様です。クラスのメンバーのデータ from/to 外部フォーム (この場合は ODBC のクエリの結果から列)との間でデータを取得または設定する必要があります。pFX パラメーターは、データ交換するためのコンテキストでは、 CObject::Serializeに CArchive パラメーターに似ています。pFX ( CFieldExchange のオブジェクト)に似ているが、汎化があります CArchive 方向のフラグの操作のインジケーター。RFX 関数は、次の操作をサポートする必要があるかも知れません:
BindParam — ODBC にパラメーター データを検索する必要があるかを示します。
BindFieldToColumn — ODBC が/落としの outputColumn のデータ取得する必要があるかを示します。
Fixup — CString/CByteArray の期間、設定の空白の状態のビットを設定します。
MarkForAddNew —値が、 AddNew の呼び出し変更する場合は、ダーティなマークします。
MarkForUpdate —値が、編集の呼び出し変更する場合は、ダーティなマークします。
名前 —フィールドのフィールド名をマークされているダーティ追加します。
—NameValue 追加します。 「=」を<項目の名前>か。 フィールドに指定されたダーティには
—値 追加します。 「または」 、などの区切り記号 " が続く場合、 " または "
SetFieldDirty —状態によってかまれるダーティ設定します (つまり。変更されたフィールド)
SetFieldNull —状態を設定します。かまれるのフィールドに NULL 値を示します
IsFieldDirty —ダーティな状態ビットの戻り値
IsFieldNull —空の状態ビットの戻り値
IsFieldNullable —フィールドに null 値を保持できる場合は true を返します。
StoreField —アーカイブのフィールドの値
LoadField —読み取りに、アーカイブ フィールドの値
GetFieldInfoValue —フィールドの一般情報を返します。
GetFieldInfoOrdinal —フィールドの一般情報を返します。
ユーザーの拡張
既定の RFX の機能を拡張する方法はいくつかあります。設定
新しいデータ型を追加します。次に例を示します。
CBookmark
新しい交換手順 RFX_ (または)と、または)を追加します。
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName, BIGINT& value);
DoFieldExchange のメンバー関数を追加の RFX 呼び出しまたは他の有効な C++ のステートメントが条件付きでようにします。
while (posExtraFields != NULL) { RFX_Text(pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues)); }
[!メモ]
このようなコードは ClassWizard が編集できないし、特殊な形式の注釈の外部でのみ使用する必要があります。
カスタム RFX を記述できます。
既存の RFX 関数をコピーし、にオブジェクトを独自に変更できる書き込みをカスタム RFX 関数を独自に推奨されます。証明機関 RFX を選択すると、コピー ジョブをより簡単にできます。RFX 関数に、考慮する必要がある一意のプロパティがありますかをコピーする場合。
RFX_Long and RFX_Int:
これらは、最も単純な RFX 関数です。データ値は特別な解釈を必要とせず、データのサイズは固定です。RFX_Single and RFX_Double:
上で RFX_Long と RFX_Int のように、これらの関数は簡単で、既定の実装を広く活用できます。が、 dbrfx.cpp の代わりに dbflt.cpp で明示的に参照の場合にだけ実行時浮動小数点のライブラリの読み込みを有効にするために保存されます。RFX_Text and RFX_Binary:
この二つの関数は、文字列やバイナリ情報を保持する静的バッファーを前もって割り当てます &value を登録する代わりに、 ODBC SQLBindCol のこれらのバッファーを登録する必要があります。このため、この二つの関数に特殊なケース コードの多くがあります。RFX_Date:
独自の TIMESTAMP_STRUCT のデータ構造の ODBC の戻りの日付と時刻の情報。この関数は、 datetime データを送受信する 「」のプロキシとして動的に TIMESTAMP_STRUCT を割り当てます。さまざまな操作は C++ CTime のオブジェクトと TIMESTAMP_STRUCT プロキシの間で日付と時刻の情報をコピーする必要があります。これは、この関数をかなり複雑になりますが、データ転送プロキシを使用する場合は、の良い例です。RFX_LongBinary:
これは、データを受け取り、送信するには、列バインディングを使用しない唯一のクラス ライブラリ RFX 関数です。この関数は、フィックスアップ操作中に、 BindFieldToColumn 操作を代わりに割り当てましたり入力 SQL_LONGVARCHAR または SQL_LONGVARBINARY のデータを保持するストレージを、ストレージに割り当てられた値を取得するために実行 SQLGetData の呼び出しを無視されます。データ ソースにデータ値を戻す前に (NameValue と値の処理など)、この関数は ODBC DATA_AT_EXEC の機能を使用します。SQL_LONGVARBINARY と SQL_LONGVARCHARs の使用の詳細については テクニカル ノート 45 を参照してください。
作成する場合 RFX_ 関数は、独自のために特定の操作を実行するために CFieldExchange::Default を使用できます。指定した操作が既定の実装を参照してください。これが操作を実行すると、 **CFieldExchange::Default.**に代入できる RFX_ 関数で記述されてdbrfx.cpp の CFieldExchange::Default を呼び出す例を確認できます
FALSE を返した場合 RFX 関数の先頭に IsFieldType をダイヤルすることが重要にすぐに返されます。この機能は outputColumnsのパラメーター操作を、その逆も保持します ( outputColumnの BindParam を呼び出すことなど)。また、 IsFieldType は自動的に outputColumns (m_nFields)とパラメーター (m_nParams)の数を追跡します。