共用方式為


資料錄集:AddNew、Edit 和 Delete 的運作方式 (ODBC)

本主題適用於 MFC ODBC 類別。

本主題說明 類別的 AddNewEditDelete 成員函 CRecordset 式如何運作。 涵蓋的主題包括:

注意

本主題適用於衍生自 CRecordset 的物件,其中尚未實作大量資料列擷取。 如果您使用大量資料列擷取,請參閱 記錄集:大量擷取記錄 (ODBC)

作為補充,您可能想要讀取 記錄字段 Exchange:RFX 的運作方式,其描述 RFX 在更新作業中對應的 RFX 角色。

新增記錄

將新記錄新增至記錄集牽涉到呼叫記錄集的 AddNew 成員函式、設定新記錄欄位數據成員的值,以及呼叫 Update 成員函式將記錄寫入數據來源。

作為呼叫 AddNew的先決條件,記錄集不得開啟為只讀。 CanUpdateCanAppend 成員函式可讓您判斷這些條件。

當您呼叫 AddNew時:

  • 編輯緩衝區中的記錄會儲存,因此如果取消作業,則可以還原其內容。

  • 欄位數據成員會標示為旗標,以便稍後偵測其中的變更。 欄位數據成員也會標示為 clean (未變更),並設定為 Null。

呼叫 AddNew之後,編輯緩衝區代表新的空白記錄,準備好填入值。 若要這樣做,您可以指派給這些值,以手動設定這些值。 您可以呼叫 SetFieldNull 來指定 Null 值,而不是指定欄位的實際資料值。

若要認可變更,請呼叫 Update。 當您呼叫 Update 新紀錄時:

  • 如果您的 ODBC 驅動程式支援 ::SQLSetPos ODBC API 函式,MFC 會使用 函式在數據源上新增記錄。 使用 ::SQLSetPos時,MFC 可以更有效率地新增記錄,因為它不需要建構及處理 SQL 語句。

  • 如果 ::SQLSetPos 無法使用,MFC 會執行下列動作:

    1. 如果未偵測到任何變更, Update 則不會執行任何動作並傳回 0。

    2. 如果有變更, Update 請建構 SQL INSERT 語句。 所有髒欄位數據成員所代表的數據行都會列在 INSERT 語句中。 若要強制包含數據行,請呼叫 SetFieldDirty 成員函式:

      SetFieldDirty( &m_dataMember, TRUE );
      
    3. Update 認可新記錄 — INSERT 語句會執行,而且記錄會認可至數據源上的數據表(如果不是快照集,則為記錄集),除非交易正在進行中。

    4. 儲存的記錄會還原至編輯緩衝區。 不論 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的先決條件,記錄集必須是可更新的,而且必須位於記錄上。 CanUpdateIsDeleted 成員函式可讓您判斷這些條件。 目前記錄也不得已經刪除,而且記錄集中必須有記錄(和IsBOFIsEOF傳回0)。

當您呼叫 Edit時,會儲存編輯緩衝區中的記錄(目前記錄)。 儲存的記錄值稍後會用來偵測是否有任何欄位變更。

呼叫 Edit之後,編輯緩衝區仍代表目前的記錄,但現在已準備好接受字段數據成員的變更。 若要變更記錄,您可以手動設定您想要編輯之任何字段數據成員的值。 您可以呼叫 SetFieldNull 來指定 Null 值,而不是指定欄位的實際資料值。 若要認可變更,請呼叫 Update

提示

若要退出 AddNew 或模式,Move請使用 參數呼叫 AFX_MOVE_REFRESHEdit

作為呼叫 Update的前置條件,記錄集不得為空白,而且目前記錄不得遭到刪除。 IsBOFIsEOFIsDeleted 應該都會傳回 0。

當您呼叫 Update 編輯的記錄時:

  • 如果您的 ODBC 驅動程式支援 ::SQLSetPos ODBC API 函式,MFC 會使用 函式來更新數據源上的記錄。 使用 ::SQLSetPos時,驅動程式會比較您的編輯緩衝區與伺服器上的對應記錄,並在兩者不同時更新伺服器上的記錄。 使用 ::SQLSetPos時,MFC 可以更有效率地更新記錄,因為它不需要建構及處理 SQL 語句。

    - 或 -

  • 如果 ::SQLSetPos 無法使用,MFC 會執行下列動作:

    1. 如果沒有變更, Update 則不會執行任何動作並傳回 0。

    2. 如果有變更, Update 請建構 SQL UPDATE 語句。 UPDATE 語句中列出的數據行是以已變更的欄位數據成員為基礎。

    3. Update 認可變更 — 會執行 UPDATE 語句 — 以及數據源上的記錄已變更,但如果交易正在進行中,則不會認可記錄(請參閱 Transaction: Execute a Transaction in a Recordset (ODBC) 以取得交易如何影響更新的資訊。 ODBC 會保留記錄的複本,也會變更。

    4. 與的程式 AddNew不同, Edit 進程不會還原儲存的記錄。 編輯的記錄會保留為當前記錄。

    警告

    當您準備藉由呼叫 Update來更新記錄集時,請小心您的記錄集包含組成數據表主鍵的所有數據行(或數據表上任何唯一索引的所有數據行,或足以唯一識別數據列的數據行)。 在某些情況下,架構只能使用記錄集中選取的數據行來識別數據表中要更新的記錄。 如果沒有所有必要的數據行,數據表中可能會更新多個記錄。 在此情況下,架構會在您呼叫 Update時擲回例外狀況。

    提示

    AddNew Edit如果您先前呼叫或呼叫任一函式之後,但在呼叫 Update之前,編輯緩衝區會以預存的記錄重新整理,並取代進行中的新記錄或編輯的記錄。 此行為可讓您中止 AddNewEdit 並開始新的行為:如果您判斷進行中的記錄有錯誤,只要呼叫或AddNew再次呼叫Edit即可。

刪除記錄

從記錄集刪除記錄牽涉到卷動至記錄,並呼叫記錄集的 Delete 成員函式。 與和 Edit不同AddNewDelete不需要對 的相符呼叫Update

作為呼叫 Delete的先決條件,記錄集必須可更新,而且必須位於記錄上。 CanUpdateIsBOFIsEOFIsDeleted 成員函式可讓您判斷這些條件。

當您呼叫 Delete時:

  • 如果您的 ODBC 驅動程式支援 ::SQLSetPos ODBC API 函式,MFC 會使用 函式來刪除數據源上的記錄。 使用 ::SQLSetPos 通常比使用 SQL 更有效率。

    - 或 -

  • 如果 ::SQLSetPos 無法使用,MFC 會執行下列動作:

    1. 編輯緩衝區中的目前記錄不會備份為 和EditAddNew

    2. Delete 建構移除記錄的 SQL DELETE 語句。

      編輯緩衝區中的目前記錄不會儲存為 和 EditAddNew

    3. Delete 認可刪除 - 執行 DELETE 語句。 記錄在資料來源上標示為已刪除,如果記錄是 ODBC 中的快照集,則為 。

    4. 已刪除的記錄值仍在記錄集的欄位數據成員中,但欄位數據成員會標示為 Null,而記錄集 IsDeleted 的成員函式會傳回非零值。

    注意

    刪除記錄之後,您應該捲動至另一筆記錄,以使用新記錄的數據重新填入編輯緩衝區。 再次呼叫 Delete 或呼叫 Edit時發生錯誤。

如需更新作業中使用的 SQL 語句相關信息,請參閱 SQL

另請參閱

資料錄集 (ODBC)
資料錄集:更多更新的詳細資訊 (ODBC)
資料錄欄位交換 (RFX)