共用方式為


資料錄集:加入、更新和刪除資料錄 (ODBC)

本主題適用於 MFC ODBC 類別。

注意

您現在可以更有效率地大量新增記錄。 如需詳細資訊,請參閱 記錄集:大量新增記錄 (ODBC)

注意

本主題適用於衍生自 CRecordset 的物件,其中尚未實作大量資料列擷取。 如果您使用大量資料列擷取,請參閱 記錄集:大量擷取記錄 (ODBC)

可更新的快照集和動態集可讓您新增、編輯(更新)和刪除記錄。 本主題將說明:

如需如何執行更新以及如何向其他使用者顯示更新的詳細資訊,請參閱 Recordset:Recordset 更新記錄的方式 (ODBC) 。 一般而言,當您新增、編輯或刪除記錄時,記錄集會立即變更資料來源。 您可以改為將相關更新批次群組放入交易中。 如果交易正在進行中,在您認可交易之前,更新不會變成最終更新。 這可讓您取回或回復變更。 如需交易的相關資訊,請參閱 交易 (ODBC)

下表摘要說明不同更新特性之記錄集可用的選項。

記錄集讀取/更新選項

類型 參閱 編輯記錄 刪除記錄 新增 (附加)
唯讀 N N N
僅限附加 N N
可完整更新 Y Y Y Y

判斷您的記錄集是否可更新

如果資料來源是可更新的,而且您已將記錄集開啟為可更新,則會更新記錄集物件。 其可更新性也取決於您使用的 SQL 語句、ODBC 驅動程式的功能,以及 ODBC 資料指標程式庫是否在記憶體中。 您無法更新唯讀記錄集或資料來源。

判斷您的記錄集是否可更新

  1. 呼叫 recordset 物件的 CanUpdate 成員函式。

    CanUpdate 如果記錄集是可更新的,則傳回非零值。

根據預設,記錄集是完全可更新的(您可以執行 AddNewEditDelete 作業)。 但您也可以使用 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 成員函式傳回非零值,您可以將新記錄新增至記錄集。

將新記錄新增至記錄集

  1. 請確定記錄集是可附加的。

  2. 呼叫 recordset 物件的 AddNew 成員函式。

    AddNew 準備記錄集以做為編輯緩衝區。 所有欄位資料成員都會設定為特殊值 Null,並標示為未變更,因此當您呼叫 Update 時,只會將變更 (dirty) 值寫入資料來源。

  3. 設定新記錄欄位資料成員的值。

    將值指派給欄位資料成員。 您未指派的人員不會寫入資料來源。

  4. 呼叫 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;
}

提示

若要取消 AddNewEdit 呼叫,只要使用 AFX_MOVE_REFRESH 參數呼叫 AddNewEdit 呼叫 或 。 Move 資料成員會重設為先前的值,且您仍處於 EditAdd 模式。

在記錄集中編輯記錄

如果您的記錄集的 CanUpdate 成員函式傳回非零值,您可以編輯現有的記錄。

若要編輯記錄集中的現有記錄

  1. 請確定記錄集是可更新的。

  2. 捲動至您要更新的記錄。

  3. 呼叫 recordset 物件的 Edit 成員函式。

    Edit 準備記錄集以做為編輯緩衝區。 所有欄位資料成員都會標示,以便記錄集稍後判斷它們是否已變更。 變更欄位資料成員的新值會在您呼叫 Update 時寫入資料來源。

  4. 設定新記錄欄位資料成員的值。

    將值指派給欄位資料成員。 您未指派值的人會保持不變。

  5. 呼叫 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;
}

提示

若要取消 AddNewEdit 呼叫,只要使用 AFX_MOVE_REFRESH 參數呼叫 AddNewEdit 呼叫 或 。 Move 資料成員會重設為先前的值,且您仍處於 EditAdd 模式。

從記錄集刪除記錄

如果記錄集的 CanUpdate 成員函式傳回非零值,您可以刪除記錄。

若要刪除記錄

  1. 請確定記錄集是可更新的。

  2. 捲動至您要更新的記錄。

  3. 呼叫 recordset 物件的 Delete 成員函式。

    Delete 在記錄集和資料來源中,立即將記錄標示為已刪除。

    與 和 Edit 不同 AddNewDelete 沒有對應的 Update 呼叫。

  4. 捲動至另一筆記錄。

    注意

    移動記錄集時,可能不會略過已刪除的記錄。 如需詳細資訊,請參閱 IsDeleted 成員函式。

下列範例顯示 Delete 作業。 它假設使用者已移至使用者想要刪除的記錄。 呼叫 之後 Delete ,請務必移至新的記錄。

rsStudent.Delete( );
rsStudent.MoveNext( );

如需 、 Edit 和 成員函式之效果 AddNew 的詳細資訊,請參閱 Recordset:Recordsets 如何更新記錄 (ODBC) Delete

另請參閱

資料錄集 (ODBC)
資料錄集:鎖定資料錄 (ODBC)