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_Text與RFX_Binary) 可以有額外的選擇性引數。
多個 RFX_ 可能會包含在每個DoDataExchange函式。
請參閱 'afxdb.h',所有的資料錄欄位交換常式隨 MFC 所提供的清單。
資料錄集欄位的呼叫是一種方法註冊 (通常是資料成員) 的記憶體位置的欄位資料儲存 CMySet 類別。
備註
資料錄集欄位函式設計用來僅適用於CRecordset類別。 它們不是一般情況下使用的任何其他的 MFC 類別。
在標準 C++,通常中建構函式的區塊中設定資料的起始值//{{AFX_FIELD_INIT(CMylSet)和//}}AFX_FIELD_INIT註解。
每個 RFX_ 函式都必須支援各種作業,不需要返回封存準備編輯欄位中的欄位] 欄位的混亂狀態範圍。
每個函式會呼叫DoFieldExchange (舉個例說SetFieldNull, IsFieldDirty),並不會本身的呼叫周圍的初始化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,或進行相反動作 (例如電話 BindParam 上 outputColumn)。 此外, IsFieldType自動記錄的計數 outputColumns (m_nFields) 和參數 (m_nParams)。