共用方式為


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

本主題適用於 MFC ODBC 類別。

本主題將說明:

注意

本主題適用於衍生自 CRecordset 的物件,其中尚未實作大量資料列擷取。 如果您已實作大量資料列擷取,則部分資訊不適用。 例如,您無法呼叫 AddNewEditDeleteUpdate 成員函式;不過,您可以執行交易。 如需大量資料列擷取的詳細資訊,請參閱 記錄集:大量擷取記錄 (ODBC)

其他作業如何影響更新

您的更新會受到更新時生效的交易、在完成交易之前關閉記錄集,以及在完成交易之前捲動而受到影響。

交易如何影響更新

除了瞭解 、 和 的運作方式 AddNew 之外,請務必瞭解 CDatabase CommitTransRollback 成員函式如何 BeginTrans 與 CRecordset 更新函式搭配運作。 DeleteEdit

根據預設,當您呼叫 Update 時,會立即呼叫 AddNewEdit 影響資料來源。 Delete 呼叫會立即生效。 但是您可以建立交易並執行一批這類呼叫。 在您認可更新之前,更新不會永久完成。 如果您改變主意,您可以回復交易,而不是認可交易。

如需交易的詳細資訊,請參閱 交易 (ODBC)

關閉記錄集如何影響更新

如果您關閉記錄集或其相關聯的 CDatabase 物件,且交易正在進行中(您尚未呼叫 CDatabase::CommitTrans CDatabase::Rollback ),則交易會自動回復(除非您的資料庫後端是 Microsoft Jet 資料庫引擎)。

警告

如果您使用 Microsoft Jet 資料庫引擎,在明確交易內關閉記錄集,就不會產生任何已修改或鎖定的資料列,直到認可或回復明確交易為止。 建議您一律在明確 Jet 交易內外開啟和關閉記錄集。

捲動如何影響更新

當您 記錄集:在記錄集中捲動(ODBC) 時,編輯緩衝區會填入每個新的目前記錄(前一筆記錄不會先儲存)。 捲動會略過先前刪除的記錄。 如果您在 或 呼叫之後 AddNew 捲動,而不呼叫 UpdateCommitTransRollback 第一個,則任何變更會遺失(不會警告您),因為新的記錄會帶入編輯 Edit 緩衝區。 編輯緩衝區會填入捲動至的記錄、儲存的記錄已釋放,而且資料來源上不會發生任何變更。 這同時 AddNew 適用于 和 Edit

您的更新和其他使用者的更新

當您使用記錄集來更新資料時,您的更新會影響其他使用者。 同樣地,記錄集存留期間其他使用者的更新也會影響您。

在多使用者環境中,其他使用者可以開啟記錄集,其中包含您在記錄集中選取的一些相同記錄。 在擷取記錄之前,記錄的變更會反映在記錄集中。 因為動態集會在每次捲動至記錄時擷取記錄,所以動態集會在每次捲動至記錄時反映變更。 快照集會在您第一次捲動記錄時擷取記錄,因此快照集只會反映您一開始捲動至記錄之前發生的變更。

在您開啟記錄集之後,其他使用者新增的記錄不會顯示在記錄集中,除非您重新查詢。 如果您的記錄集是動態集,當您捲動至受影響的記錄時,其他使用者對現有記錄的編輯就會顯示在動態集中。 如果您的記錄集是快照集,在您重新查詢快照集之前,不會顯示編輯。 如果您想要查看快照集中其他使用者新增或刪除的記錄,或動態集中其他使用者新增的記錄,請呼叫 CRecordset::Requery 來重建記錄集。 (請注意,其他使用者的刪除會顯示在您的動態集中。您也可以呼叫 Requery 來查看您新增的記錄,但不會看到刪除。

提示

若要一次強制快取整個快照集,請在開啟快照集之後立即呼叫 MoveLast 。 然後呼叫 MoveFirst 以開始使用記錄。 MoveLast 相當於捲動所有記錄,但它會一次擷取它們。 不過請注意,這可能會降低效能,而且某些驅動程式可能不需要。

更新對其他使用者的影響與您的影響類似。

關於更新和刪除的詳細資訊

本節提供其他資訊,可協助您使用 UpdateDelete

更新成功和失敗

如果 Update 成功, AddNew 則 或 Edit 模式會結束。 若要再次開始 AddNewEdit 模式,請呼叫 AddNewEdit

如果失敗(傳 Update 回 FALSE 或擲回例外狀況),您仍會 AddNew 處於 或 Edit 模式,視您上次呼叫的函式而定。 然後,您可以執行下列其中一項動作:

  • 修改欄位資料成員,然後再試 Update 一次。

  • 呼叫 AddNew 以將欄位資料成員重設為 Null、設定欄位資料成員的值,然後再呼叫 Update 一次。

  • 呼叫 Edit 以重載第一次呼叫 AddNewEdit 之前記錄集中的值,並設定欄位資料成員的值,然後再呼叫 Update 一次。 成功 Update 呼叫之後(呼叫之後 AddNew 除外),欄位資料成員會保留其新值。

  • 呼叫 Move (包括 Move 具有 AFX_MOVE_REFRESH 或 0 的參數),這會排清任何變更,並結束任何 AddNewEdit 模式的效果。

更新和刪除

本節同時 Update 適用于 和 Delete

Update在 或 Delete 作業上,應該只更新一筆記錄。 該記錄是目前記錄,對應至記錄集欄位中的資料值。 如果基於某些原因,沒有受影響的記錄或一筆以上的記錄受到影響,則會擲回例外狀況,其中包含下列 其中一個 RETCODE 值:

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED

擲回這些例外狀況時,當您呼叫 Update 或 時,您仍會處於 AddNewEditDelete 狀態。 以下是最常見的案例,您會在其中看到這些例外狀況。 您最有可能看到:

  • 當您使用開放式鎖定模式,而另一位使用者已以防止架構識別要更新或刪除的正確記錄的方式修改記錄時,AFX_SQL_ERROR_NO_ROWS_AFFECTED。

  • 當您更新的資料表沒有主鍵或唯一索引,而且記錄集中沒有足夠的資料行可唯一識別資料表資料列時,AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED。

另請參閱

資料錄集 (ODBC)
資料錄集:資料錄集選取資料錄的方式 (ODBC)
資料錄欄位交換 (RFX)
SQL
例外狀況:資料庫例外狀況