資料錄集:AddNew、Edit 和 Delete 的運作方式 (ODBC)
本主題適用於 MFC ODBC 類別。
本主題說明 類別的 AddNew
、 Edit
和 Delete
成員函 CRecordset
式如何運作。 涵蓋的主題包括:
注意
本主題適用於衍生自 CRecordset
的物件,其中尚未實作大量資料列擷取。 如果您使用大量資料列擷取,請參閱 記錄集:大量擷取記錄 (ODBC) 。
作為補充,您可能想要讀取 記錄字段 Exchange:RFX 的運作方式,其描述 RFX 在更新作業中對應的 RFX 角色。
新增記錄
將新記錄新增至記錄集牽涉到呼叫記錄集的 AddNew 成員函式、設定新記錄欄位數據成員的值,以及呼叫 Update 成員函式將記錄寫入數據來源。
作為呼叫 AddNew
的先決條件,記錄集不得開啟為只讀。 CanUpdate
和 CanAppend
成員函式可讓您判斷這些條件。
當您呼叫 AddNew
時:
編輯緩衝區中的記錄會儲存,因此如果取消作業,則可以還原其內容。
欄位數據成員會標示為旗標,以便稍後偵測其中的變更。 欄位數據成員也會標示為 clean (未變更),並設定為 Null。
呼叫 AddNew
之後,編輯緩衝區代表新的空白記錄,準備好填入值。 若要這樣做,您可以指派給這些值,以手動設定這些值。 您可以呼叫 SetFieldNull
來指定 Null 值,而不是指定欄位的實際資料值。
若要認可變更,請呼叫 Update
。 當您呼叫 Update
新紀錄時:
如果您的 ODBC 驅動程式支援
::SQLSetPos
ODBC API 函式,MFC 會使用 函式在數據源上新增記錄。 使用::SQLSetPos
時,MFC 可以更有效率地新增記錄,因為它不需要建構及處理 SQL 語句。如果
::SQLSetPos
無法使用,MFC 會執行下列動作:如果未偵測到任何變更,
Update
則不會執行任何動作並傳回 0。如果有變更,
Update
請建構 SQL INSERT 語句。 所有髒欄位數據成員所代表的數據行都會列在 INSERT 語句中。 若要強制包含數據行,請呼叫 SetFieldDirty 成員函式:SetFieldDirty( &m_dataMember, TRUE );
Update
認可新記錄 — INSERT 語句會執行,而且記錄會認可至數據源上的數據表(如果不是快照集,則為記錄集),除非交易正在進行中。儲存的記錄會還原至編輯緩衝區。 不論 INSERT 語句是否成功執行,呼叫之前
AddNew
目前記錄都是目前的記錄。
提示
若要完整控制新記錄,請採取下列方法:設定任何將具有值的欄位值,然後明確設定任何將保留 Null 的欄位,方法是使用
SetFieldNull
字段指標和參數 TRUE (預設值)。 如果您想要確保欄位未寫入數據源,請使用欄位指標和參數 FALSE 呼叫SetFieldDirty
,而且不要修改欄位的值。 若要判斷欄位是否允許為 Null,請呼叫IsFieldNullable
。提示
若要偵測記錄集數據成員何時變更值,MFC 會使用適用於您可以儲存在記錄集中之每個數據類型的PSEUDO_NULL值。 如果您必須將欄位明確設定為PSEUDO_NULL值,而且欄位已經標示為 Null,您也必須呼叫
SetFieldNull
,並在第二個參數中傳遞字段的位址,並在第二個參數中傳遞 FALSE。
已新增記錄的可見性
記錄集何時會顯示新增的記錄? 新增的記錄有時會顯示,有時不可見,視兩件事而定:
您的驅動程式能夠做什麼。
架構可以利用哪些功能。
如果您的 ODBC 驅動程式支援 ::SQLSetPos
ODBC API 函式,MFC 會使用 函式來新增記錄。 使用 ::SQLSetPos
時,任何可更新的 MFC 記錄集都可以看到新增的記錄。 若不支援 函式,則不會顯示新增的記錄,您必須呼叫 Requery
以查看它們。 使用 ::SQLSetPos
也更有效率。
編輯現有的記錄
編輯記錄集中的現有記錄牽涉到卷動至記錄、呼叫記錄集的 Edit 成員函式、設定新記錄欄位數據成員的值,以及呼叫 Update 成員函式,將變更的記錄寫入數據源。
作為呼叫 Edit
的先決條件,記錄集必須是可更新的,而且必須位於記錄上。 CanUpdate
和 IsDeleted
成員函式可讓您判斷這些條件。 目前記錄也不得已經刪除,而且記錄集中必須有記錄(和IsBOF
IsEOF
傳回0)。
當您呼叫 Edit
時,會儲存編輯緩衝區中的記錄(目前記錄)。 儲存的記錄值稍後會用來偵測是否有任何欄位變更。
呼叫 Edit
之後,編輯緩衝區仍代表目前的記錄,但現在已準備好接受字段數據成員的變更。 若要變更記錄,您可以手動設定您想要編輯之任何字段數據成員的值。 您可以呼叫 SetFieldNull
來指定 Null 值,而不是指定欄位的實際資料值。 若要認可變更,請呼叫 Update
。
提示
若要退出 AddNew
或模式,Move
請使用 參數呼叫 AFX_MOVE_REFRESHEdit
。
作為呼叫 Update
的前置條件,記錄集不得為空白,而且目前記錄不得遭到刪除。 IsBOF
、 IsEOF
和 IsDeleted
應該都會傳回 0。
當您呼叫 Update
編輯的記錄時:
如果您的 ODBC 驅動程式支援
::SQLSetPos
ODBC API 函式,MFC 會使用 函式來更新數據源上的記錄。 使用::SQLSetPos
時,驅動程式會比較您的編輯緩衝區與伺服器上的對應記錄,並在兩者不同時更新伺服器上的記錄。 使用::SQLSetPos
時,MFC 可以更有效率地更新記錄,因為它不需要建構及處理 SQL 語句。- 或 -
如果
::SQLSetPos
無法使用,MFC 會執行下列動作:如果沒有變更,
Update
則不會執行任何動作並傳回 0。如果有變更,
Update
請建構 SQL UPDATE 語句。 UPDATE 語句中列出的數據行是以已變更的欄位數據成員為基礎。Update
認可變更 — 會執行 UPDATE 語句 — 以及數據源上的記錄已變更,但如果交易正在進行中,則不會認可記錄(請參閱 Transaction: Execute a Transaction in a Recordset (ODBC) 以取得交易如何影響更新的資訊。 ODBC 會保留記錄的複本,也會變更。與的程式
AddNew
不同,Edit
進程不會還原儲存的記錄。 編輯的記錄會保留為當前記錄。
警告
當您準備藉由呼叫
Update
來更新記錄集時,請小心您的記錄集包含組成數據表主鍵的所有數據行(或數據表上任何唯一索引的所有數據行,或足以唯一識別數據列的數據行)。 在某些情況下,架構只能使用記錄集中選取的數據行來識別數據表中要更新的記錄。 如果沒有所有必要的數據行,數據表中可能會更新多個記錄。 在此情況下,架構會在您呼叫Update
時擲回例外狀況。提示
AddNew
Edit
如果您先前呼叫或呼叫任一函式之後,但在呼叫Update
之前,編輯緩衝區會以預存的記錄重新整理,並取代進行中的新記錄或編輯的記錄。 此行為可讓您中止AddNew
或Edit
並開始新的行為:如果您判斷進行中的記錄有錯誤,只要呼叫或AddNew
再次呼叫Edit
即可。
刪除記錄
從記錄集刪除記錄牽涉到卷動至記錄,並呼叫記錄集的 Delete 成員函式。 與和 Edit
不同AddNew
,Delete
不需要對 的相符呼叫Update
。
作為呼叫 Delete
的先決條件,記錄集必須可更新,而且必須位於記錄上。 CanUpdate
、IsBOF
、 IsEOF
和 IsDeleted
成員函式可讓您判斷這些條件。
當您呼叫 Delete
時:
如果您的 ODBC 驅動程式支援
::SQLSetPos
ODBC API 函式,MFC 會使用 函式來刪除數據源上的記錄。 使用::SQLSetPos
通常比使用 SQL 更有效率。- 或 -
如果
::SQLSetPos
無法使用,MFC 會執行下列動作:編輯緩衝區中的目前記錄不會備份為 和
Edit
。AddNew
Delete
建構移除記錄的 SQL DELETE 語句。編輯緩衝區中的目前記錄不會儲存為 和
Edit
。AddNew
Delete
認可刪除 - 執行 DELETE 語句。 記錄在資料來源上標示為已刪除,如果記錄是 ODBC 中的快照集,則為 。已刪除的記錄值仍在記錄集的欄位數據成員中,但欄位數據成員會標示為 Null,而記錄集
IsDeleted
的成員函式會傳回非零值。
注意
刪除記錄之後,您應該捲動至另一筆記錄,以使用新記錄的數據重新填入編輯緩衝區。 再次呼叫
Delete
或呼叫Edit
時發生錯誤。
如需更新作業中使用的 SQL 語句相關信息,請參閱 SQL。