資料錄集:更多更新的詳細資訊 (ODBC)
本主題適用於 MFC ODBC 類別。
本主題將說明:
注意
本主題適用於衍生自 CRecordset
的物件,其中尚未實作大量資料列擷取。 如果您已實作大量數據列擷取,則部分資訊不適用。 例如,您無法呼叫 AddNew
、 Edit
、 Delete
和 Update
成員函式;不過,您可以執行交易。 如需大量數據列擷取的詳細資訊,請參閱 記錄集:大量擷取記錄 (ODBC)。
其他作業如何影響更新
您的更新會受到更新時生效的交易、在完成交易之前關閉記錄集,以及在完成交易之前捲動而受到影響。
交易如何影響更新
除了瞭解 、 和 的運作方式AddNew
之外,請務必瞭解 CDatabase 的 、 CommitTrans
和 Rollback
成員函式如何BeginTrans
與 CRecordset 的更新函式搭配運作。Delete
Edit
根據預設,當您呼叫 Update
時,會立即呼叫 AddNew
並Edit
影響數據源。 Delete
呼叫會立即生效。 但是您可以建立交易並執行一批這類呼叫。 在您認可更新之前,更新不會永久完成。 如果您改變主意,您可以回復交易,而不是認可交易。
如需交易的詳細資訊,請參閱 交易 (ODBC)。
關閉記錄集如何影響更新
如果您關閉記錄集或其相關聯的 CDatabase
物件,且交易正在進行中(您尚未呼叫 CDatabase::CommitTrans 或 CDatabase::Rollback),交易會自動回復(除非您的資料庫後端是 Microsoft Jet 資料庫引擎)。
警告
如果您使用 Microsoft Jet 資料庫引擎,在明確交易內關閉記錄集,就不會產生任何已修改或鎖定的數據列,直到認可或回復明確交易為止。 建議您一律在明確 Jet 交易內外開啟和關閉記錄集。
捲動如何影響更新
當您 記錄集:在記錄集中捲動(ODBC) 時,編輯緩衝區會填入每個新的當前記錄(前一筆記錄不會先儲存)。 捲動會略過先前刪除的記錄。 如果您在 或呼叫之後AddNew
捲動,而不呼叫 Update
、 CommitTrans
或 Rollback
第一個,則任何變更會遺失(不會警告您),因為新的記錄會帶入編輯Edit
緩衝區。 編輯緩衝區會填入捲動至的記錄、儲存的記錄已釋放,而且數據源上不會發生任何變更。 這同時適用於 AddNew
與 Edit
。
您的更新和其他使用者的更新
當您使用記錄集來更新數據時,您的更新會影響其他使用者。 同樣地,記錄集存留期間其他使用者的更新也會影響您。
在多用戶環境中,其他使用者可以開啟記錄集,其中包含您在記錄集中選取的一些相同記錄。 在擷取記錄之前,記錄的變更會反映在記錄集中。 因為動態集會在每次捲動至記錄時擷取記錄,所以動態集會在每次捲動至記錄時反映變更。 快照集會在您第一次捲動記錄時擷取記錄,因此快照集只會反映您一開始捲動至記錄之前發生的變更。
在您開啟記錄集之後,其他使用者新增的記錄不會顯示在記錄集中,除非您重新查詢。 如果您的記錄集是動態集,當您捲動至受影響的記錄時,其他使用者對現有記錄的編輯就會顯示在動態集中。 如果您的記錄集是快照集,在您重新查詢快照集之前,不會顯示編輯。 如果您想要查看快照集中其他使用者新增或刪除的記錄,或動態集中其他使用者新增的記錄,請呼叫 CRecordset::Requery 來重建記錄集。 (請注意,其他使用者的刪除會顯示在您的動態集中。您也可以呼叫 Requery
來查看您新增的記錄,但不會看到刪除。
提示
若要一次強制快取整個快照集,請在開啟快照集之後立即呼叫 MoveLast
。 然後呼叫 MoveFirst
以開始使用記錄。 MoveLast
相當於捲動所有記錄,但它會一次擷取它們。 不過請注意,這可能會降低效能,而且某些驅動程式可能不需要。
更新對其他使用者的影響與您的影響類似。
關於更新和刪除的詳細資訊
本節提供其他信息,可協助您使用 Update
和 Delete
。
更新成功和失敗
如果 Update
成功, AddNew
則 或 Edit
模式會結束。 若要再次開始 AddNew
或 Edit
模式,請呼叫 AddNew
或 Edit
。
如果失敗(傳 Update
回 FALSE 或擲回例外狀況),您仍會 AddNew
處於 或 Edit
模式,視您上次呼叫的函式而定。 然後,您可以執行下列其中一項動作:
修改欄位數據成員,然後再試
Update
一次。呼叫
AddNew
以將欄位數據成員重設為 Null、設定欄位數據成員的值,然後再呼叫Update
一次。呼叫
Edit
以重載第一次呼叫AddNew
或Edit
之前記錄集中的值,並設定字段數據成員的值,然後再呼叫Update
一次。 成功Update
呼叫之後(呼叫之後AddNew
除外),欄位數據成員會保留其新值。呼叫
Move
(包括Move
具有 AFX_MOVE_REFRESH 或 0 的參數),這會排清任何變更,並結束任何AddNew
或Edit
模式的效果。
更新和刪除
本節同時 Update
適用於 和 Delete
。
Update
在 或 Delete
作業上,應該只更新一筆記錄。 該記錄是當前記錄,對應至記錄集欄位中的數據值。 如果基於某些原因,沒有受影響的記錄或一筆以上的記錄受到影響,則會擲回例外狀況,其中包含下列 其中一個 RETCODE 值:
AFX_SQL_ERROR_NO_ROWS_AFFECTED
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED
擲回這些例外狀況時,當您呼叫 Update
或 時,您仍會處於 AddNew
或 Edit
Delete
狀態。 以下是最常見的案例,您會在其中看到這些例外狀況。 您最有可能看到:
當您使用開放式鎖定模式,而另一位使用者已以防止架構識別要更新或刪除的正確記錄的方式修改記錄時,AFX_SQL_ERROR_NO_ROWS_AFFECTED。
當您更新的數據表沒有主鍵或唯一索引,而且記錄集中沒有足夠的數據行可唯一識別數據表數據列時,AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED。
另請參閱
資料錄集 (ODBC)
資料錄集:資料錄集選取資料錄的方式 (ODBC)
資料錄欄位交換 (RFX)
SQL
例外狀況:資料庫例外狀況