資料錄集:加入、更新和刪除資料錄 (ODBC)
本主題適用於 MFC ODBC 類別。
注意
您現在可以更有效率地大量新增記錄。 如需詳細資訊,請參閱 記錄集:大量新增記錄 (ODBC)。
注意
本主題適用於衍生自 CRecordset
的物件,其中尚未實作大量資料列擷取。 如果您使用大量資料列擷取,請參閱 記錄集:大量擷取記錄 (ODBC) 。
可更新的快照集和動態集可讓您新增、編輯(更新)和刪除記錄。 本主題將說明:
如何判斷您的記錄集是否可更新。
如需如何執行更新以及如何向其他使用者顯示更新的詳細資訊,請參閱 Recordset:Recordset 更新記錄的方式 (ODBC) 。 一般而言,當您新增、編輯或刪除記錄時,記錄集會立即變更數據源。 您可以改為將相關更新批次群組放入交易中。 如果交易正在進行中,在您認可交易之前,更新不會變成最終更新。 這可讓您取回或回復變更。 如需交易的相關信息,請參閱 交易 (ODBC)。
下表摘要說明不同更新特性之記錄集可用的選項。
記錄集讀取/更新選項
類型 | 參閱 | 編輯記錄 | 刪除記錄 | 新增 (附加) |
---|---|---|---|---|
唯讀 | 是 | N | N | N |
僅限附加 | 是 | N | N | 是 |
可完整更新 | Y | Y | Y | Y |
判斷您的記錄集是否可更新
如果數據源是可更新的,而且您已將記錄集開啟為可更新,則會更新記錄集物件。 其可更新性也取決於您使用的 SQL 語句、ODBC 驅動程式的功能,以及 ODBC 資料指標連結庫是否在記憶體中。 您無法更新唯讀記錄集或資料來源。
判斷您的記錄集是否可更新
呼叫 recordset 物件的 CanUpdate 成員函式。
CanUpdate
如果記錄集是可更新的,則傳回非零值。
根據預設,記錄集是完全可更新的(您可以執行 AddNew
、 Edit
和 Delete
作業)。 但您也可以使用 appendOnly 選項來開啟可更新的記錄集。 以這種方式開啟的記錄集只允許使用 AddNew
新增記錄。 您無法編輯或刪除現有的記錄。 您可以藉由呼叫 CanAppend 成員函式來測試是否只開啟記錄集以供附加。 CanAppend
如果記錄集是完全可更新或只針對附加開啟,則會傳回非零值。
下列程式代碼示範如何針對名為 rsStudentSet
的記錄集物件使用 CanUpdate
:
if( !rsStudentSet.Open( ) )
return FALSE;
if( !rsStudentSet.CanUpdate( ) )
{
AfxMessageBox( "Unable to update the Student recordset." );
return;
}
警告
當您準備藉由呼叫 Update
來更新記錄集時,請小心您的記錄集包含組成數據表主鍵的所有數據行(或數據表上任何唯一索引的所有數據行)。 在某些情況下,架構只能使用記錄集中選取的數據行來識別數據表中要更新的記錄。 如果沒有所有必要的數據行,數據表中可能會更新多個記錄,可能會損害數據表的引用完整性。 在此情況下,架構會在您呼叫 Update
時擲回例外狀況。
將記錄新增至記錄集
如果 記錄集的 CanAppend 成員函式傳回非零值,您可以將新記錄新增至記錄集。
將新記錄新增至記錄集
請確定記錄集是可附加的。
呼叫 recordset 物件的 AddNew 成員函式。
AddNew
準備記錄集以做為編輯緩衝區。 所有欄位資料成員都會設定為特殊值 Null,並標示為未變更,因此當您呼叫 Update 時,只會將變更 (dirty) 值寫入數據源。設定新記錄欄位資料成員的值。
將值指派給欄位數據成員。 您未指派的人員不會寫入資料來源。
呼叫 recordset 對象的
Update
成員函式。Update
將新記錄寫入數據源,以完成新增。 如需有關如果您無法呼叫Update
的資訊,請參閱 記錄集如何更新記錄 (ODBC) 。
如需有關新增記錄的運作方式和新增記錄在記錄集中可見的相關信息,請參閱 Recordset:AddNew、Edit 和 Delete Work (ODBC) 的方式。
下列範例示範如何新增記錄:
if( !rsStudent.Open( ) )
return FALSE;
if( !rsStudent.CanAppend( ) )
return FALSE; // no field values were set
rsStudent.AddNew( );
rsStudent.m_strName = strName;
rsStudent.m_strCity = strCity;
rsStudent.m_strStreet = strStreet;
if( !rsStudent.Update( ) )
{
AfxMessageBox( "Record not added; no field values were set." );
return FALSE;
}
提示
若要取消 AddNew
或 Edit
呼叫,只要使用 AFX_MOVE_REFRESH 參數呼叫 AddNew
或 Edit
呼叫 或Move
數據成員會重設為先前的值,且您仍處於 Edit
或 Add
模式。
在記錄集中編輯記錄
如果您的記錄集的 CanUpdate 成員函式傳回非零值,您可以編輯現有的記錄。
若要編輯記錄集中的現有記錄
請確定記錄集是可更新的。
捲動至您要更新的記錄。
呼叫 recordset 物件的 Edit 成員函式。
Edit
準備記錄集以做為編輯緩衝區。 所有欄位資料成員都會標示,以便記錄集稍後判斷它們是否已變更。 變更欄位資料成員的新值會在您呼叫 Update 時寫入數據源。設定新記錄欄位資料成員的值。
將值指派給欄位數據成員。 您未指派值的人會保持不變。
呼叫 recordset 對象的
Update
成員函式。Update
將變更的記錄寫入數據源,以完成編輯。 如需有關如果您無法呼叫Update
的資訊,請參閱 記錄集如何更新記錄 (ODBC) 。
編輯記錄之後,已編輯的記錄會保留目前的記錄。
下列範例顯示 Edit
作業。 它假設使用者已移至想要編輯的記錄。
rsStudent.Edit( );
rsStudent.m_strStreet = strNewStreet;
rsStudent.m_strCity = strNewCity;
rsStudent.m_strState = strNewState;
rsStudent.m_strPostalCode = strNewPostalCode;
if( !rsStudent.Update( ) )
{
AfxMessageBox( "Record not updated; no field values were set." );
return FALSE;
}
提示
若要取消 AddNew
或 Edit
呼叫,只要使用 AFX_MOVE_REFRESH 參數呼叫 AddNew
或 Edit
呼叫 或Move
數據成員會重設為先前的值,且您仍處於 Edit
或 Add
模式。
從記錄集刪除記錄
如果記錄集的 CanUpdate 成員函式傳回非零值,您可以刪除記錄。
若要刪除記錄
請確定記錄集是可更新的。
捲動至您要更新的記錄。
呼叫 recordset 物件的 Delete 成員函式。
Delete
在記錄集和數據源中,立即將記錄標示為已刪除。與和
Edit
不同AddNew
,Delete
沒有對應的Update
呼叫。捲動至另一筆記錄。
注意
移動記錄集時,可能不會略過已刪除的記錄。 如需詳細資訊,請參閱 IsDeleted 成員函式。
下列範例顯示 Delete
作業。 它假設使用者已移至使用者想要刪除的記錄。 呼叫 之後 Delete
,請務必移至新的記錄。
rsStudent.Delete( );
rsStudent.MoveNext( );
如需 、 Edit
和 成員函式之效果AddNew
的詳細資訊,請參閱 Recordset:Recordsets 如何更新記錄 (ODBC)Delete
。