本主题适用于 MFC ODBC 类。

备注

现在即可更有效地批量添加记录。有关更多信息,请参见记录集:批量添加记录 (ODBC)

备注

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

可更新的快照和动态集使您得以添加、编辑(更新)和删除记录。 本主题说明:

  • 如何确定您的记录集是否可以更新。

  • 如何添加新记录。

  • 如何编辑已有记录。

  • 如何删除记录。

有关如何执行更新和更新以何种方式显示给其他用户的更多信息,请参见记录集:记录集如何更新记录 (ODBC)。 通常,添加、编辑或删除记录后,记录集立即更改数据源。 而您可以将相关更新组批处理为事务。 如果事务正在进行,则直到提交事务后更新才成为最终更新。 这使您得以取消或回滚更改。 有关事务的信息,请参见事务 (ODBC)

下表总结了可用于具有不同更新特性的记录集的选项。

记录集读取/更新选项

类型

Read

编辑记录

删除记录

添加新记录(追加)

只读

Y

N

N

N

仅追加

Y

N

N

Y

可完整更新

Y

Y

Y

Y

确定记录集是否是可更新的

如果数据源是可更新的,而且记录集已以可更新的方式打开,则记录集对象是可更新的。 记录集的更新能力还取决于所使用的 SQL 语句、ODBC 驱动程序的功能以及 ODBC 游标库是否在内存中。 无法更新只读记录集和数据源。

确定记录集是否是可更新的

  • 调用记录集对象的 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. 调用记录集对象的 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)