共用方式為


TN043: 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 註解可讓類別精靈,以找出並編輯這個函式內的程式碼。 與類別精靈不相容的程式碼應該放在外的特殊格式的註解。

在上述範例中,<recordset_exchange_field_type_call> 位於表單:

pFX->SetFieldType(CFieldExchange::outputColumn);

和 <recordset_exchange_function_call> 位於表單:

RFX_Custom(pFX, "Col2", m_Col2);

大部分 RFX_ 函式有三個引數,如上所示,但有人 (例如: RFX_TextRFX_Binary) 可以有額外的選擇性引數。

多個 RFX_ 可能會包含在每個DoDataExchange函式。

請參閱 'afxdb.h',所有的資料錄欄位交換常式隨 MFC 所提供的清單。

資料錄集欄位的呼叫是一種方法註冊 (通常是資料成員) 的記憶體位置的欄位資料儲存 CMySet 類別。

備註

資料錄集欄位函式設計用來僅適用於CRecordset類別。 它們不是一般情況下使用的任何其他的 MFC 類別。

在標準 C++,通常中建構函式的區塊中設定資料的起始值//{{AFX_FIELD_INIT(CMylSet)和//}}AFX_FIELD_INIT註解。

每個 RFX_ 函式都必須支援各種作業,不需要返回封存準備編輯欄位中的欄位] 欄位的混亂狀態範圍。

每個函式會呼叫DoFieldExchange (舉個例說SetFieldNullIsFieldDirty),並不會本身的呼叫周圍的初始化DoFieldExchange

它如何運作?

您不需要瞭解,才能使用資料錄欄位交換。 不過,瞭解如何在幕後運作,將可協助您撰寫您自己的交換程序。

DoFieldExchange成員函式十分類似Serialize成員函式,它會負責取得或設定資料/來源/目的成員在類別中的資料從外部的表單 (在此案例的資料行從 ODBC 查詢的結果)。 pFX參數是用於進行資料交換的內容,類似於CArchive參數,以CObject::Serialize。 pFX ( CFieldExchange物件) 操作指標,也就是類似,但一般化的CArchive方向旗標。 RFX 函式可能需要支援下列作業:

  • BindParam — 指出 ODBC 擷取參數資料的地方

  • BindFieldToColumn ,指出其中 ODBC 必須擷取/存款 outputColumn 資料

  • 修復 --設定 CString/CByteArray 長度會設定位元的 NULL 狀態

  • MarkForAddNew — 如果值已變更,因為呼叫 AddNew 骯髒的標記

  • MarkForUpdate — 如果值已變更,因為編輯呼叫的標記不正常

  • 名稱 --新增欄位標記為已變更的欄位名稱

  • NameValue — 附加"< 資料行名稱 > = 嗎?"標示為已變更的欄位

  • — 附加"?"後面接著分隔符號,需要 ',' 或 ' '

  • SetFieldDirty--設定狀態位元已變更 (例如: 變更的) 欄位

  • SetFieldNull--設定狀態位元表示 null 欄位值

  • IsFieldDirty--傳回不乾淨的狀態位元的值

  • IsFieldNull,null 狀態位元傳回值

  • IsFieldNullable--如果傳回 TRUE 欄位可控制 NULL 值

  • 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));
    }
    
注意事項注意事項

這類程式碼類別精靈無法編輯,應該用於僅以外的特殊格式的註解。

撰寫自訂的 RFX

若要撰寫您自己的自訂 RFX 函式,建議您複製現有的 RFX 函式,並以您視個人需要進行修改。 選取要複製適當的 RFX 可以減輕您的工作更加容易。 有些 RFX 函式中有一些特有的屬性,決定要存放複製時,您應該考慮到。

  • RFX_Long 和 RFX_Int
    這些都是最簡單的 RFX 函式。 資料值不需要任何特殊的解譯方式,以及資料大小固定的。

  • RFX_Single 和 RFX_Double
    就像 RFX_Long 和 RFX_Int 上面,這些函式是單純的可以進行廣泛使用的預設實作。 它們儲存在 dbflt.cpp 的 dbrfx.cpp,而不是不過,若要啟用載入執行階段浮點程式庫僅時為它們明確地參考。

  • RFX_Text 和 RFX_Binary
    這兩個函數預先配置靜態緩衝區來容納字串/二進位資訊,並必須登錄這些緩衝區 ODBC SQLBindCol 代替註冊和值。 有鑑於此,這兩個函數會有許多特殊案例程式碼。

  • RFX_Date:
    ODBC 傳回他們自己的 TIMESTAMP_STRUCT 資料結構中的日期和時間資訊。 這個函式以動態方式配置 TIMESTAMP_STRUCT 為 「 proxy 」 傳送及接收的日期時間資料。 各種作業必須傳送的日期和時間資訊之間的 C++ CTime物件和 TIMESTAMP_STRUCT proxy。 使變得如此複雜這項功能大幅,但它是如何進行資料傳輸使用 proxy 的極佳範例。

  • RFX_LongBinary:
    這是唯一的類別程式庫不會使用接收與傳送資料的資料行繫結的 RFX 函式。 這個函式 BindFieldToColumn 作業會略過,相反地,修復操作時,會配置的空間可保存的連入 SQL_LONGVARCHAR 或 SQL_LONGVARBINARY 資料,然後執行配置的儲存體中擷取值 SQLGetData 呼叫。 當您準備將資料值送回資料來源 (例如 NameValue 和值的作業),這個函式會使用 ODBC 的 DATA_AT_EXEC 功能。 請參閱技術的附註 45 如需有關使用 SQL_LONGVARBINARY 和 SQL_LONGVARCHARs。

當撰寫您自己 RFX_ 函式,您通常可以使用 CFieldExchange::Default 來實作指定的作業。 查看作業方式在虛預設實作。 如果執行的作業就需要撰寫您 RFX_ 函式,您可以委派給 **CFieldExchange::Default。**您所見的電話範例 CFieldExchange::Default dbrfx.cpp 中

請務必呼叫IsFieldType開頭的 RFX 函式,以及當它傳回 FALSE 時,立即傳回。 這項機制會保留參數上執行的作業 outputColumns,或進行相反動作 (例如電話 BindParamoutputColumn)。 此外, IsFieldType自動記錄的計數 outputColumns (m_nFields) 和參數 (m_nParams)。

請參閱

其他資源

技術的備忘稿編號

依類別的技術注意事項