共用方式為


資料錄集: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_REFRESH Edit

作為呼叫 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 時擲回例外狀況。

    提示

    AddNewEdit 如果您先前呼叫或呼叫任一函式之後,但在呼叫 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)