共用方式為


資料錄欄位交換:RFX 的運作方式

本主題說明 RFX 程式。 這是涵蓋下列進階主題:

注意

本主題適用於衍生自尚未實作大量資料列擷取之 CRecordset 的類別。 如果您使用大量資料列擷取,就會實作大量記錄欄位交換 (大量 RFX)。 大量 RFX 與 RFX 類似。 若要了解差異,請參閱 記錄集:大量擷取記錄 (ODBC)

RFX 和 Recordset

記錄集物件的欄位數據成員,結合在一起,構成保留一筆記錄之選取數據行的編輯緩衝區。 當記錄集第一次開啟且即將讀取第一筆記錄時,RFX 會將每個選取的數據行系結至適當欄位數據成員的位址。 當記錄集更新記錄時,RFX 會呼叫 ODBC API 函式,將 SQL UPDATEINSERT 語句傳送至驅動程式。 RFX 會使用欄位資料成員的知識來指定要寫入的數據行。

架構會在特定階段備份編輯緩衝區,以便在必要時還原其內容。 RFX 會先備份編輯緩衝區,再新增記錄,再編輯現有的記錄。 在某些情況下,它會還原編輯緩衝區,例如,在下列AddNew呼叫之後Update。 如果您放棄新變更的編輯緩衝區,例如,在呼叫 Update之前移至另一筆記錄,則不會還原編輯緩衝區。

除了在數據源與記錄集的欄位數據成員之間交換數據之外,RFX 還管理係結參數。 開啟記錄集時,任何參數數據成員會依建構之 SQL 語句 CRecordset::Open 中的 “?” 佔位符順序系結。 如需詳細資訊,請參閱 Recordset:參數化 Recordset (ODBC)

記錄集類別的覆寫 DoFieldExchange 會執行所有工作,以兩個方向移動數據。 如同對話數據交換 (DDX),RFX 需要類別數據成員的相關信息。 精靈會根據您使用精靈指定的欄位資料成員名稱和數據類型,為您撰寫記錄集特定的實 DoFieldExchange 作,以提供必要的資訊。

記錄欄位交換程式

本節將描述 RFX 事件序列,因為記錄集物件已開啟,而且當您新增、更新和刪除記錄時。 本主題中 RFX 作業在記錄集開啟期間的數據表序列,以及捲動期間 RFX 作業的數據表順序,將程式顯示為 RFX 處理Move記錄集中的命令,以及 RFX 管理更新。 在這些程式期間, 會呼叫 DoFieldExchange 來執行許多不同的作業。 m_nOperation CFieldExchange 對象的數據成員會決定要求哪一項作業。 您可能會發現閱讀 Recordset:記錄集選取記錄的方式 (ODBC)記錄集:記錄集更新記錄的方式 (ODBC) 會很有説明,再閱讀此數據。

RFX:數據行和參數的初始系結

當您呼叫 recordset 物件的 Open 成員函式時,會依顯示的順序發生下列 RFX 活動:

  • 如果記錄集有參數數據成員,架構會呼叫 DoFieldExchange ,將參數係結至記錄集 SQL 語句字串中的參數佔位元。 參數值的數據類型相依表示,用於 SELECT 語句中找到的每個佔位元。 這會在 SQL 語句備妥之後,但在執行 SQL 語句之前發生。 如需語句準備的相關信息,請參閱 ::SQLPrepare ODBC 程式設計人員參考中的 函式。

  • 架構會第二次呼叫 DoFieldExchange ,將選取數據行的值系結至記錄集中的對應欄位數據成員。 這會建立 recordset 物件做為包含第一筆記錄數據行的編輯緩衝區。

  • 記錄集會執行 SQL 語句,而數據源會選取第一筆記錄。 記錄的數據行會載入記錄集的欄位數據成員。

下表顯示開啟記錄集時 RFX 作業的順序。

記錄集開啟期間 RFX 作業的順序

您的作業 DoFieldExchange 作業 資料庫/SQL 作業
1.開啟記錄集。
2.建置 SQL 語句。
3.傳送 SQL。
4.系結參數數據成員。
5.將欄位數據成員系結至數據行。
6.ODBC 會執行移動並填入數據。
7.修正C++的數據。

記錄集會使用 ODBC 的備妥執行,以允許使用相同的 SQL 語句快速重新查詢。 如需備妥執行的詳細資訊,請參閱 ODBC 程式設計人員參考

RFX:捲動

當您從一筆記錄卷動到另一筆記錄時,架構會呼叫 DoFieldExchange ,將先前儲存在欄位數據成員中的值取代為新記錄的值。

下表顯示當使用者從記錄移至記錄時,RFX 作業的順序。

捲動期間 RFX 作業的順序

您的作業 DoFieldExchange 作業 資料庫/SQL 作業
1.呼叫 MoveNext 或另一個Move函式。
2.ODBC 會執行移動並填入數據。
3.修正C++的數據。

RFX:新增記錄和編輯現有記錄

如果您新增記錄,記錄集會以編輯緩衝區的形式運作,以建立新記錄的內容。 如同新增記錄,編輯記錄牽涉到變更記錄集欄位數據成員的值。 從 RFX 的觀點來看,順序如下:

  1. 您呼叫記錄集的 AddNewEdit 成員函式會導致 RFX 儲存目前的編輯緩衝區,以便稍後還原。

  2. AddNewEdit 準備編輯緩衝區中的字段,讓 RFX 可以偵測變更的欄位數據成員。

    由於新記錄沒有要比較新記錄的值, AddNew 因此會將每個字段數據成員的值設定為PSEUDO_NULL值。 稍後,當您呼叫 Update時,RFX 會比較每個數據成員的值與PSEUDO_NULL值。 如果有差異,則已設定數據成員。 (PSEUDO_NULL與具有 true Null 值的記錄數據行不同,也不與C++ NULL 相同。

    Update與的呼叫不同,針對 Update Edit 的呼叫AddNew會比較更新的值與先前儲存的值,而不是使用 PSEUDO_NULL。 差異在於 AddNew 沒有先前儲存的值可供比較。

  3. 您可以直接設定要編輯的欄位資料成員值,或是要填入新記錄的值。 這可以包括呼叫 SetFieldNull

  4. 您呼叫 Update 檢查變更的欄位數據成員,如步驟 2 中所述(請參閱卷動期間 RFX 作業的數據表順序)。 如果沒有變更, Update 則傳回 0。 如果某些欄位資料成員已變更, Update 請準備並執行 SQL INSERT 語句,其中包含記錄中所有更新欄位的值。

  5. 針對 AddNewUpdate 最後是還原呼叫前 AddNew 目前記錄的先前儲存值。 針對 Edit,新的編輯值會保持原位。

下表顯示當您新增記錄或編輯現有記錄時 RFX 作業的順序。

AddNew 和 Edit 期間的 RFX 作業順序

您的作業 DoFieldExchange 作業 資料庫/SQL 作業
1.呼叫 AddNewEdit
2.備份編輯緩衝區。
3. 針對 AddNew,將字段數據成員標示為“clean” 和 Null。
4.將值指派給記錄集欄位數據成員。
5. 呼叫 Update
6.檢查變更的欄位。
7.建置 的 AddNew SQL INSERT 語句或 EditUPDATE 語句。
8.傳送 SQL。
9. 針對 AddNew,將編輯緩衝區還原至其備份的內容。 針對 Edit,刪除備份。

RFX:刪除現有的記錄

當您刪除記錄時,RFX 會將所有欄位設定為 NULL,提醒您記錄已刪除,而且您必須將其移出。 您不需要任何其他 RFX 序列資訊。

另請參閱

資料錄欄位交換 (RFX)
MFC ODBC 消費者
巨集、全域函式和全域變數
CFieldExchange 類別
CRecordset::DoFieldExchange