資料錄欄位交換: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