資料錄欄位交換:RFX 的運作方式
本主題說明 RFX 程式。 這是涵蓋下列進階主題:
注意
本主題適用於衍生自尚未實作大量資料列擷取之 CRecordset
的類別。 如果您使用大量資料列擷取,就會實作大量記錄欄位交換 (大量 RFX)。 大量 RFX 與 RFX 類似。 若要了解差異,請參閱 記錄集:大量擷取記錄 (ODBC)。
RFX 和 Recordset
記錄集物件的欄位數據成員,結合在一起,構成保留一筆記錄之選取數據行的編輯緩衝區。 當記錄集第一次開啟且即將讀取第一筆記錄時,RFX 會將每個選取的數據行系結至適當欄位數據成員的位址。 當記錄集更新記錄時,RFX 會呼叫 ODBC API 函式,將 SQL UPDATE 或 INSERT 語句傳送至驅動程式。 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 的觀點來看,順序如下:
AddNew
或Edit
準備編輯緩衝區中的字段,讓 RFX 可以偵測變更的欄位數據成員。由於新記錄沒有要比較新記錄的值,
AddNew
因此會將每個字段數據成員的值設定為PSEUDO_NULL值。 稍後,當您呼叫Update
時,RFX 會比較每個數據成員的值與PSEUDO_NULL值。 如果有差異,則已設定數據成員。 (PSEUDO_NULL與具有 true Null 值的記錄數據行不同,也不與C++ NULL 相同。Update
與的呼叫不同,針對Update
Edit
的呼叫AddNew
會比較更新的值與先前儲存的值,而不是使用 PSEUDO_NULL。 差異在於AddNew
沒有先前儲存的值可供比較。您可以直接設定要編輯的欄位資料成員值,或是要填入新記錄的值。 這可以包括呼叫
SetFieldNull
。您呼叫 Update 檢查變更的欄位數據成員,如步驟 2 中所述(請參閱卷動期間 RFX 作業的數據表順序)。 如果沒有變更,
Update
則傳回 0。 如果某些欄位資料成員已變更,Update
請準備並執行 SQL INSERT 語句,其中包含記錄中所有更新欄位的值。針對
AddNew
,Update
最後是還原呼叫前AddNew
目前記錄的先前儲存值。 針對Edit
,新的編輯值會保持原位。
下表顯示當您新增記錄或編輯現有記錄時 RFX 作業的順序。
AddNew 和 Edit 期間的 RFX 作業順序
您的作業 | DoFieldExchange 作業 | 資料庫/SQL 作業 |
---|---|---|
1.呼叫 AddNew 或 Edit 。 |
||
2.備份編輯緩衝區。 | ||
3. 針對 AddNew ,將字段數據成員標示為“clean” 和 Null。 |
||
4.將值指派給記錄集欄位數據成員。 | ||
5. 呼叫 Update 。 |
||
6.檢查變更的欄位。 | ||
7.建置 的 AddNew SQL INSERT 語句或 的 Edit UPDATE 語句。 |
||
8.傳送 SQL。 | ||
9. 針對 AddNew ,將編輯緩衝區還原至其備份的內容。 針對 Edit ,刪除備份。 |
RFX:刪除現有的記錄
當您刪除記錄時,RFX 會將所有欄位設定為 NULL,提醒您記錄已刪除,而且您必須將其移出。 您不需要任何其他 RFX 序列資訊。
另請參閱
資料錄欄位交換 (RFX)
MFC ODBC 消費者
巨集、全域函式和全域變數
CFieldExchange 類別
CRecordset::DoFieldExchange