记录集:添加、更新和删除记录 (ODBC)

本主题适用于 MFC ODBC 类。

注意

现在可以更高效地批量添加记录。 有关详细信息,请参阅记录集:批量添加记录 (ODBC)

注意

本主题适用于从 CRecordset 派生的对象,其中尚未实现批量提取行。 如果使用批量提取行,请参阅记录集:批量提取记录 (ODBC)

可更新的快照和动态集允许添加、编辑(更新)和删除记录。 本主题介绍:

有关如何进行更新以及如何向其他用户显示更新的详细信息,请参阅记录集:记录集如何更新记录 (ODBC)。 通常,添加、编辑或删除记录时,记录集会立即更改数据源。 可以改为在事务中对相关更新组进行批处理。 如果事务正在进行中,则在提交事务之后,更新才会最终完成。 这便于取消或回滚更改。 有关事务的详细信息,请参阅事务 (ODBC)

下表汇总了具有不同更新特征的记录集适用的选项。

记录集读取/更新选项

类型 阅读 编辑记录 删除记录 添加新记录(追加)
只读 Y N N N
仅追加 Y N N Y
完全可更新 Y Y Y Y

确定记录集是否可更新

如果数据源可更新并且已将记录集打开为可更新,则记录集对象可更新。 它的可更新性还取决于使用的 SQL 语句、ODBC 驱动程序的功能以及 ODBC 游标库是否在内存中。 不能更新只读记录集或数据源。

确定记录集是否可更新

  1. 调用记录集对象的 CanUpdate 成员函数。

    如果记录集可更新,则 CanUpdate 返回非零值。

默认情况下,记录集完全可更新(可以执行 AddNewEditDelete 操作)。 但也可以使用 appendOnly 选项打开可更新的记录集。 以这种方式打开的记录集仅允许使用 AddNew 添加新记录。 无法编辑或删除现有记录。 通过调用 CanAppend 成员函数可以测试是否仅打开记录集以供追加。 如果记录集完全可更新,或仅打开以供追加,则 CanAppend 返回一个非零值。

以下代码演示如何将 CanUpdate 用于名为 rsStudentSet 的记录集对象:

if( !rsStudentSet.Open( ) )
    return FALSE;
if( !rsStudentSet.CanUpdate( ) )
{
    AfxMessageBox( "Unable to update the Student recordset." );
    return;
}

注意

准备通过调用 Update 来更新记录集时,请注意记录集包括构成表主键的所有列(或表上任何唯一索引的所有列)。 在某些情况下,框架只能使用在记录集中选择的列来标识表中要更新的记录。 如果没有所有必要的列,可能会更新表中的多个记录,这可能会损害表的引用完整性。 在这种情况下,调用 Update 时,框架会引发异常。

将记录添加到记录集

如果记录集的 CanAppend 成员函数返回非零值,则可以向记录集添加新记录。

将新记录添加到记录集

  1. 确保记录集可追加。

  2. 调用记录集对象的 AddNew 成员函数。

    AddNew 准备好记录集以充当编辑缓冲区。 将所有字段数据成员都设置为特殊值 Null,并标记为未更改,以便调用 Update 时,只将已更改的(脏)值写入数据源。

  3. 设置新记录的字段数据成员的值。

    将值分配给字段数据成员。 未分配的值不会写入数据源。

  4. 调用记录集对象的 Update 成员函数。

    Update 通过将新记录写入数据源来完成添加。 有关 Update 调用失败的结果的信息,请参阅记录集:记录集如何更新记录 (ODBC)

有关如何添加记录以及添加的记录何时在记录集中可见的信息,请参阅记录集:AddNew、Edit 和 Delete 的工作方式 (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 调用,只需再调用 AddNewEdit,或使用 AFX_MOVE_REFRESH 参数调用 Move 数据成员将重置为以前的值,并且你将仍处于 EditAdd 模式中。

编辑记录集中的记录

如果记录集的 CanUpdate 成员函数返回非零值,则可以编辑现有记录。

编辑记录集中的现有记录

  1. 确保记录集可更新。

  2. 滚动到要更新的记录。

  3. 调用记录集对象的 Edit 成员函数。

    Edit 准备好记录集以充当编辑缓冲区。 标记所有字段数据成员,以便记录集稍后可以判断它们是否已更改。 调用 Update 时,更改的字段数据成员的新值将写入数据源。

  4. 设置新记录的字段数据成员的值。

    将值分配给字段数据成员。 未分配值的字段数据成员保持不变。

  5. 调用记录集对象的 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 调用,只需再调用 AddNewEdit,或使用 AFX_MOVE_REFRESH 参数调用 Move 数据成员将重置为以前的值,并且你将仍处于 EditAdd 模式中。

删除记录集中的记录

如果记录集的 CanUpdate 成员函数返回非零值,则可以删除记录。

删除记录

  1. 确保记录集可更新。

  2. 滚动到要更新的记录。

  3. 调用记录集对象的 Delete 成员函数。

    Delete 会立即在记录集和数据源中将记录标记为已删除。

    AddNewEdit 不同,Delete 没有相应的 Update 调用。

  4. 滚动到其他记录。

    注意

    在记录集中移动时,可能不会跳过已删除的记录。 有关详细信息,请参阅 IsDeleted 成员函数。

以下示例显示了一个 Delete 操作。 它假定用户已移动到其想要删除的记录。 调用 Delete 后,请务必移动到新记录。

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

有关 AddNewEditDelete 成员函数作用的详细信息,请参阅记录集:记录集如何更新记录 (ODBC)

另请参阅

记录集 (ODBC)
记录集:锁定记录 (ODBC)