本主题适用于 MFC ODBC 类。
注意
现在可以更高效地批量添加记录。 有关详细信息,请参阅记录集:批量添加记录 (ODBC)。
注意
本主题适用于从 CRecordset 派生的对象,其中尚未实现批量提取行。 如果使用批量提取行,请参阅记录集:批量提取记录 (ODBC)。
可更新的快照和动态集允许添加、编辑(更新)和删除记录。 本主题介绍:
有关如何进行更新以及如何向其他用户显示更新的详细信息,请参阅记录集:记录集如何更新记录 (ODBC)。 通常,添加、编辑或删除记录时,记录集会立即更改数据源。 可以改为在事务中对相关更新组进行批处理。 如果事务正在进行中,则在提交事务之后,更新才会最终完成。 这便于取消或回滚更改。 有关事务的详细信息,请参阅事务 (ODBC)。
下表汇总了具有不同更新特征的记录集适用的选项。
记录集读取/更新选项
| 类型 | 阅读 | 编辑记录 | 删除记录 | 添加新记录(追加) |
|---|---|---|---|---|
| 只读 | Y | N | N | N |
| 仅追加 | Y | N | N | Y |
| 完全可更新 | Y | Y | Y | Y |
确定记录集是否可更新
如果数据源可更新并且已将记录集打开为可更新,则记录集对象可更新。 它的可更新性还取决于使用的 SQL 语句、ODBC 驱动程序的功能以及 ODBC 游标库是否在内存中。 不能更新只读记录集或数据源。
确定记录集是否可更新
调用记录集对象的 CanUpdate 成员函数。
如果记录集可更新,则
CanUpdate返回非零值。
默认情况下,记录集完全可更新(可以执行 AddNew、Edit 和 Delete 操作)。 但也可以使用 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 成员函数返回非零值,则可以向记录集添加新记录。
将新记录添加到记录集
确保记录集可追加。
调用记录集对象的 AddNew 成员函数。
AddNew准备好记录集以充当编辑缓冲区。 将所有字段数据成员都设置为特殊值 Null,并标记为未更改,以便调用 Update 时,只将已更改的(脏)值写入数据源。设置新记录的字段数据成员的值。
将值分配给字段数据成员。 未分配的值不会写入数据源。
调用记录集对象的
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;
}
提示
若要取消 AddNew 或 Edit 调用,只需再调用 AddNew 或 Edit,或使用 AFX_MOVE_REFRESH 参数调用 Move。 数据成员将重置为以前的值,并且你将仍处于 Edit 或 Add 模式中。
编辑记录集中的记录
如果记录集的 CanUpdate 成员函数返回非零值,则可以编辑现有记录。
编辑记录集中的现有记录
确保记录集可更新。
滚动到要更新的记录。
调用记录集对象的 Edit 成员函数。
Edit准备好记录集以充当编辑缓冲区。 标记所有字段数据成员,以便记录集稍后可以判断它们是否已更改。 调用 Update 时,更改的字段数据成员的新值将写入数据源。设置新记录的字段数据成员的值。
将值分配给字段数据成员。 未分配值的字段数据成员保持不变。
调用记录集对象的
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 调用,只需再调用 AddNew 或 Edit,或使用 AFX_MOVE_REFRESH 参数调用 Move。 数据成员将重置为以前的值,并且你将仍处于 Edit 或 Add 模式中。
删除记录集中的记录
如果记录集的 CanUpdate 成员函数返回非零值,则可以删除记录。
删除记录
确保记录集可更新。
滚动到要更新的记录。
调用记录集对象的 Delete 成员函数。
Delete会立即在记录集和数据源中将记录标记为已删除。与
AddNew和Edit不同,Delete没有相应的Update调用。滚动到其他记录。
注意
在记录集中移动时,可能不会跳过已删除的记录。 有关详细信息,请参阅 IsDeleted 成员函数。
以下示例显示了一个 Delete 操作。 它假定用户已移动到其想要删除的记录。 调用 Delete 后,请务必移动到新记录。
rsStudent.Delete( );
rsStudent.MoveNext( );
有关 AddNew、Edit 和 Delete 成员函数作用的详细信息,请参阅记录集:记录集如何更新记录 (ODBC)。