共用方式為


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

本文件適用於 MFC ODBC 類別。

這個主題說明 CRecordset 類別的 AddNewEditDelete 成員函式的運作方式。 涵蓋的主題包括:

  • 加入資料錄的運作方式

  • 加入資料錄的可視性

  • 編輯資料錄的運作方式

  • 刪除資料錄的運作方式

注意事項注意事項

本文件適用於未實作大量資料列擷取的 CRecordset 衍生物件。如果您要使用大量資料列擷取,請參閱資料錄集:擷取大量資料錄 (ODBC)

您可能想要閱覽資料錄欄位交換: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. 預存的資料錄會還原至編輯緩衝區。 在呼叫 AddNew 前已是目前資料錄的資料錄,將會再次地成為目前資料錄,不論 INSERT 陳述式是否有正確地執行。

    提示

    如需取得新資料錄的完整控制項,請執行下列方法:設定任何將會具有值的欄位值,然後藉由呼叫 SetFieldNull 並搭配欄位的指標和參數 TRUE (預設值),明確設定任何將會保持為 Null 的欄位。若您想要確保欄位不會編寫資料來源,可呼叫 SetFieldDirty 並搭配一個連至欄位的指標和參數 FALSE,且不要修改欄位的值。若要決定一個欄位是否允許為 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

提示

若要離開 AddNewEdit 模式,請以 AFX_MOVE_REFRESH 參數呼叫 Move

呼叫 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 陳述式 ─ 便會變更資料來源上的資料錄,但若有交易正在處理中則不會認可變更 (如需交易如何影響更新的詳細資訊,請參閱交易:在一個資料錄集內執行交易 (ODBC))。 ODBC 所保留的資料錄複本也會做變動。

    4. 不像 AddNew 的處理程序,Edit 處理程序不會還原預存的資料錄。 編輯的資料錄仍然維持在目前資料錄的位置。

    警告

    當您呼叫 Update 來準備更新資料錄集時,請注意您的資料錄集包括了所有組成資料表主索引鍵的資料行 (或資料表上任何唯一索引鍵的所有資料行,或足以識別唯一資料列的資料行)。在某些情況下,架構只能使用您在資料錄集內選取的資料行,以識別您的資料表需進行更新的資料錄。資料表內的多筆資料錄不需要所有必要的資料行就可更新。在這種情況下,架構會在您呼叫 Update 時擲回例外狀況。

    提示

    如果您在已經呼叫過 AddNewEdit 其中一個函式後,又在呼叫 Update 之前再次呼叫它們,編輯緩衝區就會使用預存的資料錄來重新整理,取代正在處理的新資料錄或編輯資料錄。這種行為給您一種取消 AddNewEdit 並開始一個新的函式之方法:若您決定正在處理的資料錄有缺失,只要再呼叫一次 EditAddNew 即可。

刪除一筆資料錄

從資料錄集中刪除資料錄會涉及到捲動至該資料錄,以及呼叫資料錄集的 Delete 成員函式。 不像 AddNewEditDelete 並不需要配合 Update 呼叫。

呼叫 Delete 的前提是資料錄集必須是可更新的,且其必須在一筆資料錄上。 CanUpdateIsBOFIsEOFIsDeleted 成員函式讓您可決定這些條件。

當您呼叫 Delete 時:

  • 若您的 ODBC 驅動程式支援 ::SQLSetPos ODBC API 函式,MFC 會使用此函式來刪除資料來源上的資料錄。 使用 ::SQLSetPos 通常比使用 SQL 更有效率。

    -或-

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

    1. 編輯緩衝區中的目前資料錄並不會像 AddNewEdit 一樣進行備份。

    2. Delete 會建構移除資料錄的 SQL DELETE 陳述式。

      編輯緩衝區內的目前資料錄不會像 AddNewEdit 那樣預存。

    3. Delete 認可刪除動作 — 執行 DELETE 陳述式。 若資料錄是一個 ODBC 內的快照集,資料來源上的資料錄會標記為已刪除。

    4. 已刪除的資料錄值仍然留在資料錄集的欄位資料成員內,但欄位資料成員已標記為 Null 且資料錄集的 IsDeleted 成員函式會傳回非零的值。

    注意事項注意事項

    在刪除一筆資料錄後,您應該捲動至其他的資料錄,以便使用新資料錄內的資料來重填編輯緩衝區。若再次呼叫 Delete 或呼叫 Edit 就會導致錯誤。

如需使用於更新作業的 SQL 陳述式的詳細資訊,請參閱 SQL

請參閱

概念

資料錄集 (ODBC)

資料錄集:更多更新的詳細資訊 (ODBC)

資料錄欄位交換 (RFX)