CDaoRecordset 类

表示从数据源选择的一组记录。

语法

class CDaoRecordset : public CObject

成员

公共构造函数

名称 描述
CDaoRecordset::CDaoRecordset 构造 CDaoRecordset 对象。

公共方法

名称 描述
CDaoRecordset::AddNew 准备添加新记录。 调用 Update 以完成添加。
CDaoRecordset::CanAppend 如果可以通过 AddNew 成员函数将新记录添加到记录集中,则返回非零值。
CDaoRecordset::CanBookmark 如果记录集支持书签,则返回非零值。
CDaoRecordset::CancelUpdate 由于 EditAddNew 操作而取消任何挂起的更新。
CDaoRecordset::CanRestart 如果可以调用 Requery 以再次运行记录集的查询,则返回非零值。
CDaoRecordset::CanScroll 如果可以滚动浏览记录,则返回非零值。
CDaoRecordset::CanTransact 如果数据库支持事务,则返回非零。
CDaoRecordset::CanUpdate 如果可以更新记录集(可以添加、更新或删除记录),则返回非零值。
CDaoRecordset::Close 关闭记录集。
CDaoRecordset::Delete 从记录集中删除当前记录。 删除后,必须显式滚动到另一条记录。
CDaoRecordset::DoFieldExchange 调用以在记录集的字段数据成员与数据源上的相应记录之间(双向)交换数据。 实现 DAO 记录字段交换 (DFX)。
CDaoRecordset::Edit 准备对当前记录进行更改。 调用 Update 以完成编辑。
CDaoRecordset::FillCache 为包含 ODBC 数据源中数据的记录集对象填充所有或一部分本地缓存。
CDaoRecordset::Find 在满足指定条件的动态集类型记录集中查找特定字符串的第一个、下一个、上一个或最后一个位置,并将该记录设为当前记录。
CDaoRecordset::FindFirst 查找满足指定条件的动态集类型或快照类型记录集中的第一条记录,并将该记录设为当前记录。
CDaoRecordset::FindLast 查找满足指定条件的动态集类型或快照类型记录集中的最后一条记录,并将该记录设为当前记录。
CDaoRecordset::FindNext 查找满足指定条件的动态集类型或快照类型记录集中的下一条记录,并将该记录设为当前记录。
CDaoRecordset::FindPrev 查找满足指定条件的动态集类型或快照类型记录集中的上一条记录,并将该记录设为当前记录。
CDaoRecordset::GetAbsolutePosition 返回记录集对象的当前记录的记录编号。
CDaoRecordset::GetBookmark 返回一个值,该值表示记录的书签。
CDaoRecordset::GetCacheSize 返回一个值,该值指定包含要从 ODBC 数据源本地缓存的数据的动态集类型记录集中的记录数。
CDaoRecordset::GetCacheStart 返回一个值,该值指定要缓存的记录集中第一条记录的书签。
CDaoRecordset::GetCurrentIndex 返回一个 CString,其中包含索引表类型 CDaoRecordset 上最近使用的索引的名称。
CDaoRecordset::GetDateCreated 返回创建 CDaoRecordset 对象下的基表的日期和时间
CDaoRecordset::GetDateLastUpdated 返回最近对 CDaoRecordset 对象下的基表设计进行更改的日期和时间。
CDaoRecordset::GetDefaultDBName 返回默认数据源的名称。
CDaoRecordset::GetDefaultSQL 调用以获取要执行的默认 SQL 字符串。
CDaoRecordset::GetEditMode 返回一个值,该值指示当前记录的编辑状态。
CDaoRecordset::GetFieldCount 返回一个值,该值表示记录集中的字段数。
CDaoRecordset::GetFieldInfo 返回有关记录集中字段的特定类型的信息。
CDaoRecordset::GetFieldValue 返回记录集中字段的值。
CDaoRecordset::GetIndexCount 检索记录集下的表中的索引数。
CDaoRecordset::GetIndexInfo 返回有关索引的各种信息。
CDaoRecordset::GetLastModifiedBookmark 用于确定最近添加或更新的记录。
CDaoRecordset::GetLockingMode 返回一个值,该值指示在编辑期间生效的锁定类型。
CDaoRecordset::GetName 返回包含记录集名称的 CString
CDaoRecordset::GetParamValue 检索存储在基础 DAOParameter 对象中的指定参数的当前值。
CDaoRecordset::GetPercentPosition 返回当前记录的位置,以占记录总数的百分比表示。
CDaoRecordset::GetRecordCount 返回在记录集对象中访问的记录数。
CDaoRecordset::GetSQL 获取用于为记录集选择记录的 SQL 字符串。
CDaoRecordset::GetType 调用以确定记录集的类型:表类型、动态集类型或快照类型。
CDaoRecordset::GetValidationRule 返回一个 CString,其中包含用于在输入字段时验证数据的值。
CDaoRecordset::GetValidationText 检索不满足验证规则时显示的文本。
CDaoRecordset::IsBOF 如果在第一条记录之前定位了记录集,则返回非零值。 没有当前记录。
CDaoRecordset::IsDeleted 如果记录集位于已删除的记录上,则返回非零值。
CDaoRecordset::IsEOF 如果记录集位于最后一条记录之后,则返回非零值。 没有当前记录。
CDaoRecordset::IsFieldDirty 如果当前记录中的指定字段已更改,则返回非零值。
CDaoRecordset::IsFieldNull 如果当前记录中的指定字段为 Null(没有值),则返回非零值。
CDaoRecordset::IsFieldNullable 如果当前记录中的指定字段可以设置为 Null(没有值),则返回非零值。
CDaoRecordset::IsOpen 如果此前调用过 Open,则返回非零值。
CDaoRecordset::Move 将记录集置于任一方向上当前记录的指定数目记录。
CDaoRecordset::MoveFirst 将当前记录放置在记录集中的第一条记录上。
CDaoRecordset::MoveLast 将当前记录放置在记录集中的最后一条记录上。
CDaoRecordset::MoveNext 将当前记录放置在记录集中的下一条记录上。
CDaoRecordset::MovePrev 将当前记录放置在记录集中的上一条记录上。
CDaoRecordset::Open 从表、动态集或快照创建新记录集。
CDaoRecordset::Requery 再次运行记录集的查询以刷新所选记录。
CDaoRecordset::Seek 在满足当前索引的指定条件的索引表类型记录集对象中查找记录,并将该记录设为当前记录。
CDaoRecordset::SetAbsolutePosition 设置记录集对象的当前记录的记录编号。
CDaoRecordset::SetBookmark 将记录集放置在包含指定书签的记录上。
CDaoRecordset::SetCacheSize 设置一个值,该值指定包含要从 ODBC 数据源本地缓存的数据的动态集类型记录集中的记录数。
CDaoRecordset::SetCacheStart 设置一个值,该值指定要缓存的记录集中第一条记录的书签。
CDaoRecordset::SetCurrentIndex 调用以在表类型记录集上设置索引。
CDaoRecordset::SetFieldDirty 将当前记录中的指定字段标记为已更改。
CDaoRecordset::SetFieldNull 将当前记录中指定字段的值设置为 Null(没有值)。
CDaoRecordset::SetFieldValue 设置记录集中字段的值。
CDaoRecordset::SetFieldValueNull 将记录集中字段的值设置为 Null。 (没有值)。
CDaoRecordset::SetLockingMode 设置一个值,该值指示要在编辑期间生效的锁定类型。
CDaoRecordset::SetParamValue 设置存储在基础 DAOParameter 对象中的指定参数的当前值
CDaoRecordset::SetParamValueNull 将指定的参数的当前值设置为 Null(没有值)。
CDaoRecordset::SetPercentPosition 将当前记录的位置设置为与占记录集中记录总数百分比对应的位置。
CDaoRecordset::Update 通过在数据源上保存新数据或编辑的数据来完成 AddNewEdit 操作。

公共数据成员

“属性” 描述
CDaoRecordset::m_bCheckCacheForDirtyFields 包含一个标志,指示字段是否自动标记为已更改。
CDaoRecordset::m_nFields 包含记录集类中的字段数据成员数,以及记录集从数据源中选择的列数。
CDaoRecordset::m_nParams 包含记录集类中参数数据成员的数量 — 与记录集查询一起传递的参数数量
CDaoRecordset::m_pDAORecordset 指向记录集对象下的 DAO 接口的指针。
CDaoRecordset::m_pDatabase 此结果集的源数据库。 包含指向 CDaoDatabase 对象的指针。
CDaoRecordset::m_strFilter 包含用于构造 SQL WHERE 语句的字符串
CDaoRecordset::m_strSort 包含用于构造 SQL ORDER BY 语句的字符串

注解

CDaoRecordset 对象称为“记录集”,采用以下三种形式:

  • 表类型记录集表示可用于在单一数据库表中检查、添加、更改或删除记录的基表。

  • 动态集类型记录集是可以包含可更新记录的查询的结果。 这些记录集是一组记录,可用于在一个或多个基础数据库表中检查、添加、更改或删除记录。 动态集类型记录集可以包含来自数据库中一个或多个表的字段。

  • 快照类型记录集是一组记录的静态副本,可用于查找数据或生成报告。 这些记录集可以包含来自数据库中一个或多个表的字段,但不可更新。

每种形式的记录集表示一组在打开记录集时固定的记录。 滚动到表类型记录集或动态集类型记录集中的记录时,将反映打开记录集后对记录所做的更改,无论是其他用户还是应用程序中其他记录集所做的更改。 (无法更新快照类型记录集。)可以直接使用 CDaoRecordset,或从 CDaoRecordset 派生特定于应用程序的记录集类。 然后,可以:

  • 滚动浏览记录。

  • 使用 Seek 设置索引并快速查找记录(仅限表类型记录集)。

  • 根据字符串比较查找记录:“<”、“<=”、“=”、“>=”或“>”(动态集类型和快照类型记录集)。

  • 更新记录并指定锁定模式(快照类型记录集除外)。

  • 筛选记录集以约束它从数据源上可用的记录中选择的记录。

  • 对记录集进行排序。

  • 参数化记录集以使用在运行时之前未知的信息自定义其选择。

CDaoRecordset 类提供的接口类似于 CRecordset 类。 主要差别在于,类 CDaoRecordset 通过基于 OLE 的数据访问对象 (DAO) 访问数据。 类 CRecordset 通过开放式数据库连接 (ODBC) 和 DBMS 的 ODBC 驱动程序访问该 DBMS。

注意

DAO 数据库类不同于基于开放式数据库连接 (ODBC) 的 MFC 数据库类。 所有 DAO 数据库类名都具有“CDao”前缀。 你仍然可以使用 DAO 类访问 ODBC 数据源;DAO 类通常提供卓越的功能,因为它们是 Microsoft Jet 数据库引擎所特有的。

可以直接使用 CDaoRecordset 或从 CDaoRecordset 派生一个类。 若要在任一情况下使用记录集类,请打开数据库并构造记录集对象,并将构造函数传递给指向 CDaoDatabase 对象的指针。 还可以构造一个 CDaoRecordset 对象并让 MFC 为你创建一个临时 CDaoDatabase 对象。 然后调用记录集的 Open 成员函数,并指定对象是表类型记录集、动态集类型记录集还是快照类型记录集。 调用 Open 会从数据库中选择数据并检索第一条记录。

使用对象的成员函数和数据成员来滚动浏览记录并对其进行操作。 可用的操作取决于对象是表类型记录集、动态集类型记录集还是快照类型记录集,以及它是可更新的还是只读的 – 这取决于数据库或开放数据库连接 (ODBC) 数据源的功能。 若要刷新自调用 Open 以来可能已更改或添加的记录,请调用对象的 Requery 成员函数。 调用对象的 Close 成员函数,并在使用结束时销毁该对象。

CDaoRecordset 使用 DAO 记录字段交换 (DFX) 来支持通过 CDaoRecordsetCDaoRecordset 派生类的类型安全 C++ 成员读取和更新记录字段。 还可以使用 GetFieldValueSetFieldValue 实现数据库中列的动态绑定,而无需使用 DFX 机制。

有关信息,请参阅 DAO 帮助中的主题“记录集对象”。

继承层次结构

CObject

CDaoRecordset

要求

标头:afxdao.h

CDaoRecordset::AddNew

调用此成员函数可将新记录添加到表类型或动态集类型记录集。

virtual void AddNew();

注解

记录的字段最初为 Null。 (在数据库术语中,Null 表示“没有值”,并且与 C++ 中的 NULL 不同。)若要完成该操作,必须调用 Update 成员函数。 Update 保存对数据源的更改。

注意

如果你编辑一条记录,然后在不调用 Update 的情况下滚动到另一条记录,则更改将会丢失且不发出警告。

如果你通过调用 AddNew 将记录添加到动态集类型记录集,该记录将在记录集中可见并包含在基础表中,在该表中它将对任何新的 CDaoRecordset 对象可见。

新记录的位置取决于记录集的类型:

  • 在动态集类型记录集中,不能保证新记录的插入位置。 由于性能和并发性的原因,此行为在 Microsoft Jet 3.0 中已更改。 如果你的目标是将新添加的记录设为当前记录,请获取最后一条修改的记录的书签并移到该书签:
rs.SetBookmark(rs.GetLastModifiedBookmark());
  • 在已为其指定索引的表类型记录集中,记录将按排序顺序返回到其适当位置。 如果未指定索引,则在记录集的末尾返回新记录。

在使用 AddNew 之前的当前记录仍是当前记录。 如果你要将新记录设为当前记录,并且记录集支持书签,请对基础 DAO 记录集对象的 LastModified 属性设置标识的书签调用 SetBookmark。 这有助于确定已添加的记录中计数器(自动递增)字段的值。 有关详细信息,请参阅 GetLastModifiedBookmark

如果数据库支持事务,则可以调用 AddNew 作为事务的一部分。 有关事务的详细信息,请参阅 CDaoWorkspace 类。 请注意,应在调用 AddNew 之前调用 CDaoWorkspace::BeginTrans

对未调用 Open 成员函数的记录集调用 AddNew 是非法的。 如果对无法追加的记录集调用 AddNew,则会引发 CDaoException。 可以通过调用 CanAppend 来确定记录集是否可更新。

框架标记更改的字段数据成员,以确保它们通过 DAO 记录字段交换 (DFX) 机制写入到数据源中的记录。 更改字段的值通常会自动将字段设置为“脏”,因此很少需要自行调用 SetFieldDirty,但有时你可能希望确保无论字段数据成员中的值是什么,都会显式更新或插入列。 DFX 机制还采用 PSEUDO NULL。 有关详细信息,请参阅 CDaoFieldExchange::m_nOperation

如果未使用双重缓冲机制,则更改字段的值不会自动将该字段设置为脏字段。 在这种情况下,需要显式将字段设置为脏字段。 m_bCheckCacheForDirtyFields 中包含的标志控制此自动字段检查。

注意

如果记录已双重缓冲(即启用了自动字段检查),则调用 CancelUpdate 会将成员变量还原为调用 AddNewEdit 之前的值。

有关信息,请参阅 DAO 帮助中的主题“AddNew 方法”、“CancelUpdate 方法”、“LastModified 属性”和“EditMode 属性”。

CDaoRecordset::CanAppend

调用此成员函数可确定先前打开的记录集是否允许通过调用 AddNew 成员函数来添加新记录。

BOOL CanAppend() const;

返回值

如果记录集允许添加新记录,则为非零值;否则为 0。 如果打开的记录集为只读,CanAppend 将返回 0。

备注

有关信息,请参阅 DAO 帮助中的主题“Append 方法”。

CDaoRecordset::CanBookmark

调用此成员函数可确定先前打开的记录集是否允许使用书签单独标记记录。

BOOL CanBookmark();

返回值

如果记录集支持书签,则返回非零值;否则返回 0。

备注

如果使用的记录集完全基于 Microsoft Jet 数据库引擎表,则可以使用书签,但标记为仅限前向滚动的记录集的快照类型记录集除外。 其他数据库产品(外部 ODBC 数据源)可能不支持书签。

有关信息,请参阅 DAO 帮助中的主题“Bookmarkable 属性”。

CDaoRecordset::CancelUpdate

CancelUpdate 成员函数会由于 EditAddNew 操作而取消任何挂起的更新。

virtual void CancelUpdate();

备注

例如,如果应用程序调用 EditAddNew 成员函数并且未调用 Update,则 CancelUpdate 会取消在调用 EditAddNew 之后所做的任何更改。

注意

如果记录已双重缓冲(即启用了自动字段检查),则调用 CancelUpdate 会将成员变量还原为调用 AddNewEdit 之前的值。

如果没有挂起的 EditAddNew 操作,CancelUpdate 会导致 MFC 引发异常。 调用 GetEditMode 成员函数可以确定是否存在可取消的挂起操作。

有关信息,请参阅 DAO 帮助中的主题“CancelUpdate 方法”。

CDaoRecordset::CanRestart

调用此成员函数可确定记录集是否允许通过调用 Requery 成员函数来重启查询(以刷新其记录)。

BOOL CanRestart();

返回值

如果可以调用 Requery 以再次运行记录集的查询,则返回非零值,否则返回 0。

备注

表类型记录集不支持 Requery

如果不支持 Requery,请依次调用 CloseOpen 以刷新数据。 更改参数值后,可以调用 Requery 来更新记录集对象的基础参数查询。

有关信息,请参阅 DAO 帮助中的主题“Restartable 属性”。

CDaoRecordset::CanScroll

调用此成员函数可确定记录集是否允许滚动。

BOOL CanScroll() const;

返回值

如果可以滚动记录,则返回非零值;否则返回 0。

注解

如果使用 dbForwardOnly 调用 Open,则记录集只能向前滚动。

有关信息,请参阅 DAO 帮助中的主题“使用 DAO 定位当前记录指针”。

CDaoRecordset::CanTransact

调用此成员函数可确定记录集是否事务。

BOOL CanTransact();

返回值

如果基础数据源支持事务,则返回非零值;否则返回 0。

备注

有关信息,请参阅 DAO 帮助中的主题“Transactions 属性”。

CDaoRecordset::CanUpdate

调用此成员函数可以确定记录集是否可更新。

BOOL CanUpdate() const;

返回值

如果记录集可更新(添加、更新和删除记录),则返回非零值;否则返回 0。

备注

如果基础数据源为只读,或者在对记录集调用 Open 时为 nOptions 指定了 dbReadOnly,则记录集可能为只读

有关信息,请参阅 DAO 帮助中的主题“AddNew 方法”、“Edit 方法”、“Delete 方法”、“Update 方法”和“Updatable 属性”。

CDaoRecordset::CDaoRecordset

构造 CDaoRecordset 对象。

CDaoRecordset(CDaoDatabase* pDatabase = NULL);

参数

pDatabase
包含指向 CDaoDatabase 对象或值 NULL 的指针。 如果不为 NULL 并且未调用 CDaoDatabase 对象的 Open 成员函数将其连接到数据源,则记录集会在其自身的 Open 调用期间尝试打开它。 如果传递 NULL,则使用指定的数据源信息(如果从 CDaoRecordset 派生了记录集类)构造并连接 CDaoDatabase 对象。

注解

可以直接使用 CDaoRecordset,也可以从 CDaoRecordset 中派生特定于应用程序的类。 可以使用 ClassWizard 派生记录集类。

注意

如果派生 CDaoRecordset 类,则派生类必须提供自身的构造函数。 在派生类的构造函数中,调用构造函数 CDaoRecordset::CDaoRecordset,并向其传递相应的参数。

将 NULL 传递给记录集构造函数,以便自动构造并连接 CDaoDatabase 对象。 这是一种有效的捷径,不需要在构造记录集之前构造和连接 CDaoDatabase 对象。 如果 CDaoDatabase 对象未打开,则还会为你创建一个使用默认工作区的 CDaoWorkspace 对象。 有关详细信息,请参阅 CDaoDatabase::CDaoDatabase

CDaoRecordset::Close

关闭 CDaoRecordset 对象会将其从关联数据库中打开的记录集的集合中删除。

virtual void Close();

备注

由于 Close 不会销毁 CDaoRecordset 对象,因此你可以通过对相同或不同数据源调用 Open 来重用该对象。

所有挂起的 AddNewEdit 语句都将取消,所有挂起的事务都将回滚。 如果你要保留挂起的添加或编辑语句,请在对每个记录集调用 Close 之前调用 Update

可以在调用 Close 后再次调用 Open。 这样,便可以重复使用记录集对象。 如果可能,更好的替代做法是调用 Requery

有关信息,请参阅 DAO 帮助中的主题“Close 方法”。

CDaoRecordset::Delete

调用此成员函数可删除已打开的动态集类型或表类型记录集对象中的当前记录。

virtual void Delete();

备注

成功删除后,记录集的字段数据成员将设置为 Null 值,必须显式调用记录集导航成员函数之一(MoveSeekSetBookmark 等)以移除已删除的记录。 从记录集中删除记录时,在调用 Delete 之前记录集中必须存在当前记录;否则 MFC 将引发异常。

Delete 删除当前记录并使其不可访问。 尽管无法编辑或使用已删除的记录,但它仍保持为当前记录。 但是,一旦移到另一条记录,就无法再次将已删除的记录设为当前记录。

注意

记录集必须可更新,并且调用 Delete 时记录集中必须存在有效的当前记录。 例如,如果删除了记录,但在再次调用 Delete 之前不会滚动到新记录,则 Delete 会引发 CDaoException

如果使用事务并调用 CDaoWorkspace::Rollback 成员函数,则可以取消删除记录。 如果基表是级联删除关系中的主表,则删除当前记录也可能会删除外部表中的一条或多条记录。 有关详细信息,请参阅 DAO 帮助中的定义“级联删除”。

AddNewEdit 不同,调用 Delete 后不会跟着调用 Update

有关信息,请参阅 DAO 帮助中的主题“AddNew 方法”、“Edit 方法”、“Delete 方法”、“Update 方法”和“Updatable 属性”。

CDaoRecordset::DoFieldExchange

框架将调用此成员函数,以在记录集对象的字段数据成员与数据源上当前记录的相应列之间自动交换数据。

virtual void DoFieldExchange(CDaoFieldExchange* pFX);

参数

pFX
包含指向 CDaoFieldExchange 对象的指针。 框架已设置此对象,以指定字段交换操作的上下文。

备注

它还将参数数据成员(如果有)绑定到用于记录集选择的 SQL 语句字符串中的参数占位符。 字段数据的交换(称为 DAO 记录字段交换 (DFX))双向工作:从记录集对象的字段数据成员到数据源上的记录字段,以及从数据源上的记录到记录集对象。 如果动态绑定列,则不需要实现 DoFieldExchange

要为派生的记录集类实现 DoFieldExchange,通常必须采取的唯一操作是使用 ClassWizard 创建类,并指定字段数据成员的名称和数据类型。 还可将代码添加到 ClassWizard 写入的内容中以指定参数数据成员。 如果要动态绑定所有字段,则除非指定参数数据成员,否则此函数将处于非活动状态。

使用 ClassWizard 声明派生的记录集类时,向导会为你写入 DoFieldExchange 的重写,类似于以下示例:

void CCustSet::DoFieldExchange(CDaoFieldExchange *pFX)
{
   pFX->SetFieldType(CDaoFieldExchange::param);
   DFX_Text(pFX, _T("Param"), m_strParam);
   pFX->SetFieldType(CDaoFieldExchange::outputColumn);
   DFX_Short(pFX, _T("EmployeeID"), m_EmployeeID);
   DFX_Text(pFX, _T("LastName"), m_LastName);
   DFX_Short(pFX, _T("Age"), m_Age);
   DFX_DateTime(pFX, _T("hire_date"), m_hire_date);
   DFX_DateTime(pFX, _T("termination_date"), m_termination_date);

   CDaoRecordset::DoFieldExchange(pFX);
}

CDaoRecordset::Edit

调用此成员函数可允许对当前记录进行更改。

virtual void Edit();

备注

调用 Edit 成员函数后,对当前记录的字段所做的更改将复制到复制缓冲区。 对记录进行所需更改后,调用 Update 以保存更改。 Edit 保存记录集的数据成员的值。 如果调用 Edit、进行更改,然后再次调用 Edit,记录的值将还原到第一次调用 Edit 之前的值。

注意

如果编辑一条记录,然后在不事先调用 Update 的情况下执行移到另一条记录的任何操作,则更改将会丢失且不发出警告。 此外,如果关闭记录集或父数据库,则编辑的记录将被丢弃且不会发出警告。

在某些情况下,你可能希望通过使其为 Null(不包含数据)来更新列。 为此,请使用 TRUE 参数调用 SetFieldNull 以标记字段 Null;这也会导致更新列。 如果希望将字段写入数据源,即使其值尚未更改,请使用 TRUE 参数调用 SetFieldDirty。 即使字段的值为 Null,也可以这样做。

框架标记更改的字段数据成员,以确保它们通过 DAO 记录字段交换 (DFX) 机制写入到数据源中的记录。 更改字段的值通常会自动将字段设置为“脏”,因此很少需要自行调用 SetFieldDirty,但有时你可能希望确保无论字段数据成员中的值是什么,都会显式更新或插入列。 DFX 机制还采用 PSEUDO NULL。 有关详细信息,请参阅 CDaoFieldExchange::m_nOperation

如果未使用双重缓冲机制,则更改字段的值不会自动将该字段设置为脏字段。 在这种情况下,需要显式将字段设置为脏字段。 m_bCheckCacheForDirtyFields 中包含的标志控制此自动字段检查。

当记录集对象在多用户环境中悲观锁定时,从使用 Edit 开始到更新完成的这段时间,记录将保持锁定状态。 如果记录集已乐观锁定,则记录将保持锁定,并与它在数据库中更新之前那一刻的编辑前记录进行比较。 如果记录在调用 Edit 后已更改,则 Update 操作将会失败,并且 MFC 会引发异常。 可以使用 SetLockingMode 来更改锁定模式。

注意

乐观锁定始终用于外部数据库格式,例如 ODBC 和可安装的 ISAM。

在调用 Edit 后,当前记录仍是当前记录。 若要调用 Edit,必须存在当前记录。 如果不存在当前记录,或者如果记录集不引用已打开的表类型或动态集类型的记录集对象,则会发生异常。 在以下情况下调用 Edit 会导致引发 CDaoException

  • 没有当前记录。

  • 数据库或记录集是只读的。

  • 记录中没有可更新的字段。

  • 数据库或记录集已打开以供另一用户独占使用。

  • 另一用户已锁定包含你的记录的页。

如果数据源支持事务,则可以调用 Edit 作为事务的一部分。 请注意,应在调用 Edit 之前和记录集打开之后调用 CDaoWorkspace::BeginTrans。 另请注意,调用 CDaoWorkspace::CommitTrans 不能替代调用 Update 来完成 Edit 操作。 有关事务的详细信息,请参阅 CDaoWorkspace 类。

有关信息,请参阅 DAO 帮助中的主题“AddNew 方法”、“Edit 方法”、“Delete 方法”、“Update 方法”和“Updatable 属性”。

CDaoRecordset::FillCache

调用此成员函数可缓存记录集中指定数量的记录。

void FillCache(
    long* pSize = NULL,
    COleVariant* pBookmark = NULL);

参数

pSize
指定要在缓存中填充的行数。 如果省略此参数,则值由基础 DAO 对象的 CacheSize 属性设置确定。

pBookmark
用于指定书签的 COleVariant。 缓存从此书签指示的记录开始填充。 如果省略此参数,则从基础 DAO 对象的 CacheStart 属性指示的记录开始填充缓存。

注解

缓存提高了从远程服务器检索或提取数据的应用程序的性能。 缓存是本地内存中的空间,用于保存最近从服务器提取的数据(假设在应用程序运行时可能再次请求该数据)。 请求数据时,Microsoft Jet 数据库引擎首先会检查缓存中的数据,而不是从服务器提取数据,这需要更多时间。 在非 ODBC 数据源上使用数据缓存没有作用,因为数据不会保存在缓存中。

可以随时通过调用 FillCache 成员函数来显式填充缓存,而无需等待在提取记录时使用记录填充缓存。 这是一种更快的缓存填充方式,因为 FillCache 一次可以提取多条记录,而不是逐个提取。 例如,在显示每屏记录时,可以让应用程序调用 FillCache 来提取下一屏记录。

使用记录集对象访问的任何 ODBC 数据库可以有本地缓存。 若要创建缓存,请从远程数据源打开记录集对象,然后调用记录集的 SetCacheSizeSetCacheStart 成员函数。 如果 lSize 和 lBookmark 创建的范围有一部分或完全超出 SetCacheSizeSetCacheStart 指定的范围,则超出此范围的记录集部分将被忽略,而不会加载到缓存中。 如果 FillCache 请求的记录数超过远程数据源中保留的记录数,则仅提取剩余的记录,且不引发异常。

从缓存中提取的记录不反映其他用户同时对源数据所做的更改。

FillCache 仅提取尚未缓存的记录。 若要强制更新所有已缓存的数据,请调用 SetCacheSize 成员函数并将 lSize 参数设置为 0,再次调用 SetCacheSize 并将 lSize 参数设置为最初请求的缓存大小,然后调用 FillCache

有关信息,请参阅 DAO 帮助中的主题“FillCache 方法”。

CDaoRecordset::Find

调用此成员函数可使用比较运算符查找动态集或快照类型记录集中的特定字符串。

virtual BOOL Find(
    long lFindType,
    LPCTSTR lpszFilter);

参数

lFindType
指示所需 Find 操作类型的值。 可能的值为:

  • AFX_DAO_NEXT:查找匹配字符串的下一个位置。

  • AFX_DAO_PREV:查找匹配字符串的上一个位置。

  • AFX_DAO_FIRST:查找匹配字符串的第一个位置。

  • AFX_DAO_LAST:查找匹配字符串的最后一个位置。

lpszFilter
用于查找记录的字符串表达式(类似于不包含单词 WHERE 的 SQL 语句中的 WHERE 子句)。 例如:

rs.Find(AFX_DAO_FIRST, _T("EmployeeID = 7"));
rs.Find(AFX_DAO_NEXT, _T("LastName = 'Jones'"));

返回值

如果找到匹配的记录,则返回非零值;否则返回 0。

备注

可以查找字符串的第一个、下一个、上一个或最后一个实例。 Find 是一个虚拟函数,因此你可以重写它并添加自己的实现。 FindFirstFindLastFindNextFindPrev 成员函数调用 Find 成员函数,因此你可以使用 Find 来控制所有 Find 操作的行为。

若要在表类型记录集中查找记录,请调用 Seek 成员函数。

提示

记录集越小,Find 效率越高。 一般情况下(尤其是对于 ODBC 数据),最好创建一个只检索所需记录的新查询。

有关信息,请参阅 DAO 帮助中的主题“FindFirst、FindLast、FindNext、FindPrevious 方法”。

CDaoRecordset::FindFirst

调用此成员函数可查找与指定的条件匹配的第一条记录。

BOOL FindFirst(LPCTSTR lpszFilter);

参数

lpszFilter
用于查找记录的字符串表达式(类似于不包含单词 WHERE 的 SQL 语句中的 WHERE 子句)

返回值

如果找到匹配的记录,则返回非零值;否则返回 0。

注解

FindFirst 成员函数从记录集的开头开始搜索,并搜索到记录集的结尾。

如果你想要在搜索中包括所有记录(不仅仅是那些满足特定条件的记录),请使用 Move 操作之一从一条记录移到另一条记录。 若要在表类型记录集中查找记录,请调用 Seek 成员函数。

如果未找到符合条件的记录,则当前记录指针是不确定的,并且 FindFirst 会返回零。 如果记录集包含多个满足条件的记录,则 FindFirst 将查找第一个匹配项,FindNext 将查找下一个匹配项,依此类推。

注意

如果编辑当前记录,请务必在移到另一条记录之前调用 Update 成员函数来保存更改。 如果在不更新的情况下移到另一条记录,则更改将会丢失且不发出警告。

Find 成员函数从下表中指定的位置朝所述方向进行搜索:

Find 操作 Begin 搜索方向
FindFirst 记录集的开头 记录集的末尾
FindLast 记录集的末尾 记录集的开头
FindNext 当前记录 记录集的末尾
FindPrevious 当前记录 记录集的开头

注意

调用 FindLast 时,Microsoft Jet 数据库引擎会在开始搜索之前完全填充记录集(如果尚未填充)。 首次搜索所需的时间可能比后续搜索更长。

但是,使用一个 Find 操作与调用 MoveFirstMoveNext 不同,后者只将第一条或下一条记录设为当前记录,而不会指定条件。 可以在执行 Find 操作之后接着执行 Move 操作。

使用 Find 操作时请记住以下几点:

  • 如果 Find 返回非零值,则表示未定义当前记录。 在这种情况下,必须将当前记录指针定位回到有效记录。

  • 无法对仅限前向滚动的快照类型记录集使用 Find 操作。

  • 当搜索包含日期的字段时,应使用美国日期格式(月-日-年),即使使用的不是美国版 Microsoft Jet 数据库引擎;否则,可能找不到匹配的记录。

  • 使用 ODBC 数据库和大型动态集时,你可能发现 Find 操作速度很慢,尤其是在使用大型记录集时。 可以通过将 SQL 查询与自定义的 ORDERBY 或 WHERE 子句、参数查询或检索特定索引记录的 CDaoQuerydef 对象结合使用来提高性能

有关信息,请参阅 DAO 帮助中的主题“FindFirst、FindLast、FindNext、FindPrevious 方法”。

CDaoRecordset::FindLast

调用此成员函数可查找与指定的条件匹配的最后一条记录。

BOOL FindLast(LPCTSTR lpszFilter);

参数

lpszFilter
用于查找记录的字符串表达式(类似于不包含单词 WHERE 的 SQL 语句中的 WHERE 子句)

返回值

如果找到匹配的记录,则返回非零值;否则返回 0。

备注

FindLast 成员函数从记录集的末尾开始搜索,向后搜索到记录集的开头。

如果你想要在搜索中包括所有记录(不仅仅是那些满足特定条件的记录),请使用 Move 操作之一从一条记录移到另一条记录。 若要在表类型记录集中查找记录,请调用 Seek 成员函数。

如果未找到符合条件的记录,则当前记录指针是不确定的,并且 FindLast 会返回零。 如果记录集包含多个满足条件的记录,则 FindFirst 将查找第一个匹配项,FindNext 将查找第一个匹配项后面的下一个匹配项,依此类推。

注意

如果编辑当前记录,请务必在移到另一条记录之前调用 Update 成员函数来保存更改。 如果在不更新的情况下移到另一条记录,则更改将会丢失且不发出警告。

但是,使用一个 Find 操作与调用 MoveFirstMoveNext 不同,后者只将第一条或下一条记录设为当前记录,而不会指定条件。 可以在执行 Find 操作之后接着执行 Move 操作。

使用 Find 操作时请记住以下几点:

  • 如果 Find 返回非零值,则表示未定义当前记录。 在这种情况下,必须将当前记录指针定位回到有效记录。

  • 无法对仅限前向滚动的快照类型记录集使用 Find 操作。

  • 当搜索包含日期的字段时,应使用美国日期格式(月-日-年),即使使用的不是美国版 Microsoft Jet 数据库引擎;否则,可能找不到匹配的记录。

  • 使用 ODBC 数据库和大型动态集时,你可能发现 Find 操作速度很慢,尤其是在使用大型记录集时。 可以通过将 SQL 查询与自定义的 ORDERBY 或 WHERE 子句、参数查询或检索特定索引记录的 CDaoQuerydef 对象结合使用来提高性能

有关信息,请参阅 DAO 帮助中的主题“FindFirst、FindLast、FindNext、FindPrevious 方法”。

CDaoRecordset::FindNext

调用此成员函数可查找与指定的条件匹配的下一条记录。

BOOL FindNext(LPCTSTR lpszFilter);

参数

lpszFilter
用于查找记录的字符串表达式(类似于不包含单词 WHERE 的 SQL 语句中的 WHERE 子句)

返回值

如果找到匹配的记录,则返回非零值;否则返回 0。

备注

FindNext 成员函数从当前记录开始搜索到记录集的末尾。

如果你想要在搜索中包括所有记录(不仅仅是那些满足特定条件的记录),请使用 Move 操作之一从一条记录移到另一条记录。 若要在表类型记录集中查找记录,请调用 Seek 成员函数。

如果未找到符合条件的记录,则当前记录指针是不确定的,并且 FindNext 会返回零。 如果记录集包含多个满足条件的记录,则 FindFirst 将查找第一个匹配项,FindNext 将查找下一个匹配项,依此类推。

注意

如果编辑当前记录,请务必在移到另一条记录之前调用 Update 成员函数来保存更改。 如果在不更新的情况下移到另一条记录,则更改将会丢失且不发出警告。

但是,使用一个 Find 操作与调用 MoveFirstMoveNext 不同,后者只将第一条或下一条记录设为当前记录,而不会指定条件。 可以在执行 Find 操作之后接着执行 Move 操作。

使用 Find 操作时请记住以下几点:

  • 如果 Find 返回非零值,则表示未定义当前记录。 在这种情况下,必须将当前记录指针定位回到有效记录。

  • 无法对仅限前向滚动的快照类型记录集使用 Find 操作。

  • 当搜索包含日期的字段时,应使用美国日期格式(月-日-年),即使使用的不是美国版 Microsoft Jet 数据库引擎;否则,可能找不到匹配的记录。

  • 使用 ODBC 数据库和大型动态集时,你可能发现 Find 操作速度很慢,尤其是在使用大型记录集时。 可以通过将 SQL 查询与自定义的 ORDERBY 或 WHERE 子句、参数查询或检索特定索引记录的 CDaoQuerydef 对象结合使用来提高性能

有关信息,请参阅 DAO 帮助中的主题“FindFirst、FindLast、FindNext、FindPrevious 方法”。

CDaoRecordset::FindPrev

调用此成员函数可查找与指定的条件匹配的上一条记录。

BOOL FindPrev(LPCTSTR lpszFilter);

参数

lpszFilter
用于查找记录的字符串表达式(类似于不包含单词 WHERE 的 SQL 语句中的 WHERE 子句)

返回值

如果找到匹配的记录,则返回非零值;否则返回 0。

备注

FindPrev 成员函数从当前记录开始向后搜索到记录集的开头。

如果你想要在搜索中包括所有记录(不仅仅是那些满足特定条件的记录),请使用 Move 操作之一从一条记录移到另一条记录。 若要在表类型记录集中查找记录,请调用 Seek 成员函数。

如果未找到符合条件的记录,则当前记录指针是不确定的,并且 FindPrev 会返回零。 如果记录集包含多个满足条件的记录,则 FindFirst 将查找第一个匹配项,FindNext 将查找下一个匹配项,依此类推。

注意

如果编辑当前记录,请务必在移到另一条记录之前调用 Update 成员函数来保存更改。 如果在不更新的情况下移到另一条记录,则更改将会丢失且不发出警告。

但是,使用一个 Find 操作与调用 MoveFirstMoveNext 不同,后者只将第一条或下一条记录设为当前记录,而不会指定条件。 可以在执行 Find 操作之后接着执行 Move 操作。

使用 Find 操作时请记住以下几点:

  • 如果 Find 返回非零值,则表示未定义当前记录。 在这种情况下,必须将当前记录指针定位回到有效记录。

  • 无法对仅限前向滚动的快照类型记录集使用 Find 操作。

  • 当搜索包含日期的字段时,应使用美国日期格式(月-日-年),即使使用的不是美国版 Microsoft Jet 数据库引擎;否则,可能找不到匹配的记录。

  • 使用 ODBC 数据库和大型动态集时,你可能发现 Find 操作速度很慢,尤其是在使用大型记录集时。 可以通过将 SQL 查询与自定义的 ORDERBY 或 WHERE 子句、参数查询或检索特定索引记录的 CDaoQuerydef 对象结合使用来提高性能

有关信息,请参阅 DAO 帮助中的主题“FindFirst、FindLast、FindNext、FindPrevious 方法”。

CDaoRecordset::GetAbsolutePosition

返回记录集对象的当前记录的记录编号。

long GetAbsolutePosition();

返回值

一个整数,范围为从 0 到记录集中的记录数。 对应于当前记录在记录集中的序号位置。

注解

基础 DAO 对象的 AbsolutePosition 属性值从零开始;设置为 0 表示记录集中的第一条记录。 可以通过调用 GetRecordCount 来确定记录集中填充的记录数。 调用 GetRecordCount 可能需要一些时间,因为它必须访问所有记录才能确定计数。

如果没有当前记录(例如,记录集中没有记录时),将返回 -1。 如果删除了当前记录,则不会定义 AbsolutePosition 属性值,并且 MFC 会引发异常(如果已引用)。 对于动态集类型记录集,新记录将添加到序列的末尾。

注意

此属性不旨在用作代理项记录编号。 书签仍然是保留和返回给定位置的建议方式,并且是在所有类型的记录集对象中定位当前记录的唯一方式。 具体而言,给定记录的位置会在删除其前面的记录时更改。 此外,如果再次重新创建记录集,则无法确保给定记录集具有相同的绝对位置,因为不能保证记录集中各个记录的顺序,除非使用 ORDERBY 子句通过 SQL 语句创建记录集

注意

此成员函数仅对动态集类型和快照类型记录集有效。

有关信息,请参阅 DAO 帮助中的主题“AbsolutePosition 属性”。

CDaoRecordset::GetBookmark

调用此成员函数可获取特定记录中的书签值。

COleVariant GetBookmark();

返回值

返回表示当前记录的书签的值。

注解

创建或打开某个记录集对象时,该记录集的每条记录已有一个唯一的书签(如果支持书签)。 调用 CanBookmark 可确定记录集是否支持书签。

可以通过将书签的值分配到 COleVariant 对象来保存当前记录的书签。 若要在移到其他记录后随时快速返回到该记录,请使用与该 COleVariant 对象的值对应的参数调用 SetBookmark

注意

调用 Requery 会更改 DAO 书签。

有关信息,请参阅 DAO 帮助中的主题“Bookmark 属性”。

CDaoRecordset::GetCacheSize

调用此成员函数可获取缓存的记录数。

long GetCacheSize();

返回值

一个指定包含要从 ODBC 数据源本地缓存的数据的动态集类型记录集中的记录数的值。

备注

数据缓存提高了通过动态集类型记录集对象从远程服务器检索数据的应用程序的性能。 缓存是本地内存中的空间,用于保存最近从服务器检索的数据(如果在应用程序运行时再次请求该数据)。 请求数据时,Microsoft Jet 数据库引擎首先会在缓存中检查请求的数据,而不是从服务器检索数据,这需要更多时间。 不是来自 ODBC 数据源的数据不会保存在缓存中。

任何 ODBC 数据源(例如附加的表)都可以有本地缓存。

有关信息,请参阅 DAO 帮助中的主题“CacheSize、CacheStart 属性”。

CDaoRecordset::GetCacheStart

调用此成员函数可获取要缓存的记录集中第一条记录的书签值。

COleVariant GetCacheStart();

返回值

一个 COleVariant,指定要缓存的记录集中第一条记录的书签。

备注

Microsoft Jet 数据库引擎从缓存请求缓存范围内的记录,并从服务器请求缓存范围以外的记录。

注意

从缓存中检索的记录不反映其他用户同时对源数据所做的更改。

有关信息,请参阅 DAO 帮助中的主题“CacheSize、CacheStart 属性”。

CDaoRecordset::GetCurrentIndex

调用此成员函数可确定索引表类型 CDaoRecordset 对象中当前使用的索引。

CString GetCurrentIndex();

返回值

一个 CString,其中包含当前用于表类型记录集的索引名称。 如果未设置索引,则返回空字符串。

备注

此索引是对表类型记录集中的记录进行排序的依据,由 Seek 成员函数用来查找记录。

CDaoRecordset 对象可以有多个索引,但每次只能使用一个索引(不过,可为 CDaoTableDef 对象定义多个索引)。

有关信息,请参阅 DAO 帮助中的主题“索引对象”和定义“当前索引”。

CDaoRecordset::GetDateCreated

调用此成员函数可检索基表的创建日期和时间。

COleDateTime GetDateCreated();

返回值

包含基表创建日期和时间的 COleDateTime 对象。

备注

日期和时间设置派生自创建基表的计算机。

有关相关信息,请参阅 DAO 帮助中的主题“DateCreated、LastUpdated 属性”。

CDaoRecordset::GetDateLastUpdated

调用此成员函数可检索架构的上次更新日期和时间。

COleDateTime GetDateLastUpdated();

返回值

一个 COleDateTime 对象,其中包含基表结构(架构)的上次更新日期和时间。

备注

日期和时间设置派生自上次更新基表结构(架构)的计算机。

有关相关信息,请参阅 DAO 帮助中的主题“DateCreated、LastUpdated 属性”。

CDaoRecordset::GetDefaultDBName

调用此成员函数可确定此记录集的数据库名称。

virtual CString GetDefaultDBName();

返回值

一个 CString,其中包含此记录集派生自的数据库的路径和名称。

备注

如果创建的记录集没有指向 CDaoDatabase 的指针,则记录集将使用此路径来打开默认数据库。 默认情况下,此函数返回空字符串。 当 ClassWizard 从 CDaoRecordset 派生新记录集时,它将为你创建此函数。

以下示例演示如何在字符串中使用双反斜杠 (\\),这是正确解释字符串所必需的。

CString CCustSet::GetDefaultDBName()
{
   return _T("c:\\mydir\\datasrc.mdb");
}

CDaoRecordset::GetDefaultSQL

框架调用此成员函数,以获取记录集所基于的默认 SQL 语句。

virtual CString GetDefaultSQL();

返回值

包含默认 SQL 语句的 CString

备注

这可能是表名或 SQL SELECT 语句

可以通过使用 ClassWizard 声明记录集类来间接定义默认 SQL 语句,而 ClassWizard 将为你执行此任务。

如果将 null SQL 字符串传递给 Open,则会调用此函数来确定记录集的表名或 SQL。

CDaoRecordset::GetEditMode

调用此成员函数可确定编辑状态,即以下值之一:

short GetEditMode();

返回值

返回一个值,该值指示当前记录的编辑状态。

注解

说明
dbEditNone 没有正在进行的编辑操作。
dbEditInProgress 已调用 Edit
dbEditAdd 已调用 AddNew

有关信息,请参阅 DAO 帮助中的主题“EditMode 属性”。

CDaoRecordset::GetFieldCount

调用此成员函数可检索记录集中定义的字段(列)数。

short GetFieldCount();

返回值

记录集中的字段数。

注解

要了解相关信息,请参阅 DAO 帮助中的主题“Count 属性”。

CDaoRecordset::GetFieldInfo

调用此成员函数可获取有关记录集中字段的信息。

void GetFieldInfo(
    int nIndex,
    CDaoFieldInfo& fieldinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

void GetFieldInfo(
    LPCTSTR lpszName,
    CDaoFieldInfo& fieldinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

参数

nIndex
记录集的 Fields 集合中预定义字段的从零开始的索引,用于按索引查找。

fieldinfo
CDaoFieldInfo 结构的引用。

dwInfoOptions
指定要检索记录集的哪些信息的选项。 此处列出了可用的选项,以及它们导致函数返回的原因。 为获取最佳性能,请仅检索所需级别的信息:

  • AFX_DAO_PRIMARY_INFO(默认)名称、类型、大小、属性

  • AFX_DAO_SECONDARY_INFO 主要信息以及:序号位置、必需、允许零长度、排序顺序、外部名称、源字段、源表

  • AFX_DAO_ALL_INFO 主要信息和辅助信息,以及:默认值、验证规则、验证文本

lpszName
字段的名称。

备注

该函数的一个版本允许按索引查找字段。 使用其他版本可以按名称查找字段。

有关返回的信息的说明,请参阅 CDaoFieldInfo 结构。 此结构的成员对应于上述 dwInfoOptions 说明中列出的信息项。 如果请求某一级别的信息,还可以获得任何先前级别的信息。

要了解相关信息,请参阅 DAO 帮助中的主题“Attributes 属性”。

CDaoRecordset::GetFieldValue

调用此成员函数可检索记录集中的数据。

virtual void GetFieldValue(
    LPCTSTR lpszName,
    COleVariant& varValue);

virtual void GetFieldValue(
    int nIndex,
    COleVariant& varValue);

virtual COleVariant GetFieldValue(LPCTSTR lpszName);
virtual COleVariant GetFieldValue(int nIndex);

参数

lpszName
指向包含字段名称的字符串的指针。

varValue
对存储字段值的 COleVariant 对象的引用。

nIndex
记录集的 Fields 集合中字段的从零开始的索引,用于按索引查找。

返回值

返回值的两个 GetFieldValue 版本将返回一个包含字段值的 COleVariant 对象。

注解

可以按名称或按序号位置查找字段。

注意

调用此成员函数的将 COleVariant 对象引用用作参数的某个版本,比调用返回 COleVariant 对象的版本更有效。 保留此函数的后一个版本是为了实现后向兼容。

请使用 GetFieldValueSetFieldValue 在运行时动态绑定字段,而不要使用 DoFieldExchange 机制静态绑定列。

可以结合 GetFieldValueDoFieldExchange 机制来提高性能。 例如,使用 GetFieldValue 仅按需检索所需的值,并将该调用分配到界面中的“详细信息”按钮。

有关信息,请参阅 DAO 帮助中的主题“Field 对象”和“Value 属性”。

CDaoRecordset::GetIndexCount

调用此成员函数可确定表类型记录集中提供的索引数。

short GetIndexCount();

返回值

表类型记录集中的索引数。

备注

GetIndexCount 可用于循环访问记录集中的所有索引。 为此,请将 GetIndexCountGetIndexInfo 结合使用。 如果对动态集类型或快照类型记录集调用此成员函数,MFC 将引发异常。

要了解相关信息,请参阅 DAO 帮助中的主题“Attributes 属性”。

CDaoRecordset::GetIndexInfo

调用此成员函数可获取有关在记录集下的基表中定义的索引的各种信息。

void GetIndexInfo(
    int nIndex,
    CDaoIndexInfo& indexinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

void GetIndexInfo(
    LPCTSTR lpszName,
    CDaoIndexInfo& indexinfo,
    DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);

参数

nIndex
表的 Indexes 集合中从零开始的索引,用于按编号位置查找。

indexinfo
CDaoIndexInfo 结构的引用。

dwInfoOptions
指定要检索索引的哪些信息的选项。 此处列出了可用的选项,以及它们导致函数返回的原因。 为获取最佳性能,请仅检索所需级别的信息:

  • AFX_DAO_PRIMARY_INFO(默认值)名称、字段信息、字段

  • AFX_DAO_SECONDARY_INFO 主要信息,以及:主要、唯一、聚集、忽略 Null、必需、外部

  • AFX_DAO_ALL_INFO 主要信息和辅助信息,以及:非重复计数

lpszName
指向索引对象名称的指针,用于按名称查找。

注解

该函数的一个版本使你可以按索引在集合中的位置来查找它。 使用其他版本,可以按名称查找索引。

有关返回的信息的说明,请参阅 CDaoIndexInfo 结构。 此结构的成员对应于上述 dwInfoOptions 说明中列出的信息项。 如果请求某一级别的信息,还可以获得任何先前级别的信息。

要了解相关信息,请参阅 DAO 帮助中的主题“Attributes 属性”。

CDaoRecordset::GetLastModifiedBookmark

调用此成员函数可检索最近添加或更新的记录的书签。

COleVariant GetLastModifiedBookmark();

返回值

一个包含书签的 COleVariant,指示最近添加或更改的记录。

备注

创建或打开某个记录集对象时,该记录集的每条记录已有一个唯一的书签(如果支持书签)。 调用 GetBookmark 可确定记录集是否支持书签。 如果记录集不支持书签,则会引发 CDaoException

添加记录时,该记录会出现在记录集的末尾,且不是当前记录。 若要将新记录设为当前记录,请调用 GetLastModifiedBookmark,然后调用 SetBookmark 以返回到新添加的记录。

有关信息,请参阅 DAO 帮助中的主题“LastModified 属性”。

CDaoRecordset::GetLockingMode

调用此成员函数可确定对记录集生效的锁定类型。

BOOL GetLockingMode();

返回值

如果锁定类型是悲观锁定,则返回非零值;如果是乐观记录锁定,则返回 0。

注解

当悲观锁定生效时,一旦调用 Edit 成员函数,就会锁定包含你正在编辑的记录的数据页。 调用 UpdateClose 成员函数或者执行任何 Move 或 Find 操作时,会解锁该页。

如果乐观锁定生效,仅当使用 Update 成员函数更新记录时才锁定包含记录的数据页。

使用 ODBC 数据源时,锁定模式始终为乐观。

有关信息,请参阅 DAO 帮助中的主题“LockEdits 属性”和“多用户应用程序中的锁定行为”。

CDaoRecordset::GetName

调用此成员函数可检索记录集的名称。

CString GetName();

返回值

一个包含记录集名称的 CString

注解

记录集的名称必须以字母开头,最多可以包含 40 个字符。 它可以包含数字和下划线字符,但不能包含标点符号或空格。

要了解相关信息,请参阅 DAO 帮助中的主题“Name 属性”。

CDaoRecordset::GetParamValue

调用此成员函数可检索存储在基础 DAOParameter 对象中的指定参数的当前值。

virtual COleVariant GetParamValue(int nIndex);
virtual COleVariant GetParamValue(LPCTSTR lpszName);

参数

nIndex
参数在基础 DAOParameter 对象中的编号位置。

lpszName
需要其值的参数的名称。

返回值

包含参数值的 COleVariant 类对象。

注解

可以按名称或按其在集合中的编号位置访问参数。

有关信息,请参阅 DAO 帮助中的主题“Parameter 对象”。

CDaoRecordset::GetPercentPosition

使用动态集类型或快照类型记录集时,如果在完全填充记录集之前调用 GetPercentPosition,则移动量与 GetRecordCount 调用指示的访问记录数相关。

float GetPercentPosition();

返回值

一个介于 0 和 100 之间的数字,它根据记录集中的记录数百分比指示当前记录在记录集对象中的大致位置。

备注

可以通过调用 MoveLast 移到最后一条记录来完成所有记录集的填充,但这可能需要很长时间。

可对所有三种类型的记录集对象(包括没有索引的表)调用 GetPercentPosition。 但是,无法对仅限前向滚动的快照或者从针对外部数据库的传递查询打开的记录集调用 GetPercentPosition。 如果没有当前记录或者已删除当前记录,则会引发 CDaoException

有关信息,请参阅 DAO 帮助中的主题“PercentPosition 属性”。

CDaoRecordset::GetRecordCount

调用此成员函数可确定已访问记录集中的多少条记录。

long GetRecordCount();

返回值

返回在记录集对象中访问的记录数。

注解

GetRecordCount 不指示在访问所有记录之前,动态集类型或快照类型记录集中包含多少条记录。 此成员函数调用可能需要很长时间才能完成。

访问最后一条记录后,返回值将指示记录集中未删除记录的总数。 若要强制访问最后一条记录,请对记录集调用 MoveLastFindLast 成员函数。 还可以使用 SQL Count 来确定查询将返回的大致记录数。

当应用程序删除动态集类型记录集中的记录时,GetRecordCount 的返回值会减小。 但是,在将当前记录定位到已删除的记录之前,GetRecordCount 不会反映其他用户删除的记录。 如果执行影响记录计数的事务并随后回滚该事务,则 GetRecordCount 不会反映剩余记录的实际数量。

快照类型记录集中的 GetRecordCount 的值不受基础表中的更改的影响。

表类型记录集中的 GetRecordCount 的值反映表中的大致记录数,并且会在添加和删除表记录时立即受到影响。

不包含记录的记录集返回值 0。 使用附加表或 ODBC 数据库时,GetRecordCount 始终返回 -1。 对记录集调用 Requery 成员函数会重置 GetRecordCount 的值,就像重新执行了查询一样。

有关信息,请参阅 DAO 帮助中的主题“RecordCount 属性”。

CDaoRecordset::GetSQL

调用此成员函数可获取用于在打开记录集时用于选择记录集记录的 SQL 语句。

CString GetSQL() const;

返回值

一个包含 SQL 语句的 CString

备注

这通常是 SQL SELECT 语句

GetSQL 返回的字符串通常不同于你传递给 Open 成员函数的 lpszSQL 参数中的记录集的任何字符串。 这是因为,记录集根据你传递给 Open 的内容、使用 ClassWizard 指定的内容以及在 m_strFilterm_strSort 数据成员中指定的内容构造完整的 SQL 语句。

注意

仅在调用 Open 后调用此成员函数。

有关信息,请参阅 DAO 帮助中的主题“SQL 属性”。

CDaoRecordset::GetType

打开记录集后调用此成员函数可确定记录集对象的类型。

short GetType();

返回值

以下指示记录集类型的值之一:

  • dbOpenTable 表类型记录集

  • dbOpenDynaset 动态集类型记录集

  • dbOpenSnapshot 快照类型记录集

注解

有关信息,请参阅 DAO 帮助中的主题“Type 属性”。

CDaoRecordset::GetValidationRule

调用此成员函数可确定用于验证数据的规则。

CString GetValidationRule();

返回值

一个 CString 对象,其中包含一个用于在更改记录中数据或将其添加到表时对其进行验证的值。

备注

此规则基于文本,每次更改基础表时都会应用。 如果数据不合法,MFC 将引发异常。 返回的错误消息是基础字段对象的 ValidationText 属性文本(如果已指定),或者是基础字段对象的 ValidationRule 属性指定的表达式文本。 可以调用 GetValidationText 来获取错误消息的文本。

例如,记录中需要月份日期的字段可能具有“DAY BETWEEN 1 AND 31”之类的验证规则。

要了解相关信息,请参阅 DAO 帮助中的主题“ValidationRule 属性”。

CDaoRecordset::GetValidationText

调用此成员函数可检索基础字段对象的 ValidationText 属性文本。

CString GetValidationText();

返回值

一个 CString 对象,其中包含当字段值不符合基础字段对象的验证规则时显示的消息文本。

备注

有关信息,请参阅 DAO 帮助中的主题“ValidationText 属性”。

CDaoRecordset::IsBOF

在从一条记录滚动到另一条记录之前调用此成员函数,了解是否已在记录集的第一条记录之前滚动。

BOOL IsBOF() const;

返回值

如果记录集不包含任何记录,或者在第一条记录之前向后滚动,则返回非零值;否则返回 0。

注解

还可以结合 IsEOF 调用 IsBOF 来确定记录集是否包含任何记录或为空。 调用 Open 后,如果记录集不包含任何记录,IsBOF 将立即返回非零值。 打开至少有一条记录的记录集时,第一条记录为当前记录且 IsBOF 返回 0。

如果第一条记录是当前记录并且你调用 MovePrev,则 IsBOF 将随后返回非零值。 如果 IsBOF 返回非零值并且你调用 MovePrev,则会引发异常。 如果 IsBOF 返回非零值,则当前记录未定义,且任何需要当前记录的操作都将导致异常。

特定方法对 IsBOFIsEOF 设置的影响:

  • 在内部调用 Open* 会通过调用 MoveFirst 将记录集中的第一条记录设为当前记录。 因此,对空记录集调用 Open 会导致 IsBOFIsEOF 返回非零值。 (有关失败的 MoveFirstMoveLast 调用的行为,请参阅下表。)

  • 所有成功找到记录的 Move 操作都会导致 IsBOFIsEOF 返回 0。

  • 执行成功插入新记录的 AddNew 调用后接着执行 Update 调用将导致 IsBOF 返回 0,但前提是 IsEOF 不为零。 IsEOF 的状态始终保持不变。 根据 Microsoft Jet 数据库引擎的定义,空记录集的当前记录指针位于文件末尾,因此任何新记录将插入到当前记录之后。

  • 任何 Delete 调用都不会更改 IsBOFIsEOF 的值,即使它从记录集中删除唯一剩下的一条记录。

下表显示了允许对 IsBOF/ IsEOF 的不同组合使用哪些 Move 操作。

State MoveFirst、MoveLast MovePrev

Move < 0
Move 0 MoveNext,

Move > 0
IsBOF 不为零

IsEOF=0
允许 Exception Exception 允许
IsBOF=0,

IsEOF 不为零
允许 允许 Exception Exception
均不为值 Exception Exception Exception Exception
均为 0 允许 允许 允许 允许

允许 Move 操作并不意味着该操作将成功找到记录。 它仅表示允许尝试执行指定的 Move 操作且不生成异常。 IsBOFIsEOF 成员函数的值可能因尝试移动而更改。

下表显示了找不到记录的 Move 操作对 IsBOFIsEOF 设置值的影响。

Operations IsBOF IsEOF
MoveFirstMoveLast 非零 非零
Move 0 没有变化 没有变化
MovePrev, Move< 0 非零 没有变化
MoveNext, Move> 0 没有变化 非零

有关信息,请参阅 DAO 帮助中的主题“BOF、EOF 属性”。

CDaoRecordset::IsDeleted

调用此成员函数可确定是否已删除当前记录。

BOOL IsDeleted() const;

返回值

如果记录集定位在已删除的记录上,则返回非零值;否则返回 0。

注解

如果滚动到记录且 IsDeleted 返回 TRUE(非零值),则必须滚动到另一条记录,然后才能执行任何其他记录集操作。

注意

不需要检查快照或表类型记录集中的记录的删除状态。 由于无法从快照中删除记录,因此无需调用 IsDeleted。 对于表类型记录集,删除的记录实际上会从记录集中移除。 一旦某条记录被你或其他用户删除,或者在另一个记录集中删除,就无法滚动回到该记录。 因此无需调用 IsDeleted

从动态集删除某条记录时,它将从记录集中移除,你无法滚动回到该记录。 但是,如果动态集中的某条记录被另一个用户删除,或者在基于同一表的另一个记录集中删除,则当随后滚动到该记录时,IsDeleted 将返回 TRUE。

有关信息,请参阅 DAO 帮助中的主题“Delete 方法”、“LastModified 属性”和“EditMode 属性”。

CDaoRecordset::IsEOF

在从一条记录滚动到另一条记录时调用此成员函数,了解是否已滚动到记录集的最后一条记录之外。

BOOL IsEOF() const;

返回值

如果记录集不包含任何记录,或者滚动到最后一条记录之外,则为非零值;否则为 0。

备注

还可以调用 IsEOF 来确定记录集是否包含任何记录或为空。 调用 Open 后,如果记录集不包含任何记录,IsEOF 将立即返回非零值。 打开至少有一条记录的记录集时,第一条记录为当前记录且 IsEOF 返回 0。

如果最后一条记录是当前记录并且你调用 MoveNext,则 IsEOF 将随后返回非零值。 如果 IsEOF 返回非零值并且你调用 MoveNext,则会引发异常。 如果 IsEOF 返回非零值,则当前记录未定义,且任何需要当前记录的操作都将导致异常。

特定方法对 IsBOFIsEOF 设置的影响:

  • 在内部调用 Open 会通过调用 MoveFirst 将记录集中的第一条记录设为当前记录。 因此,对空记录集调用 Open 会导致 IsBOFIsEOF 返回非零值。 (有关失败的 MoveFirst 调用的行为,请参阅下表。)

  • 所有成功找到记录的 Move 操作都会导致 IsBOFIsEOF 返回 0。

  • 执行成功插入新记录的 AddNew 调用后接着执行 Update 调用将导致 IsBOF 返回 0,但前提是 IsEOF 不为零。 IsEOF 的状态始终保持不变。 根据 Microsoft Jet 数据库引擎的定义,空记录集的当前记录指针位于文件末尾,因此任何新记录将插入到当前记录之后。

  • 任何 Delete 调用都不会更改 IsBOFIsEOF 的值,即使它从记录集中删除唯一剩下的一条记录。

下表显示了允许对 IsBOF/ IsEOF 的不同组合使用哪些 Move 操作。

状态 MoveFirst、MoveLast MovePrev

Move < 0
Move 0 MoveNext,

Move > 0
IsBOF 不为零

IsEOF=0
允许 Exception Exception 允许
IsBOF=0,

IsEOF 不为零
允许 允许 Exception Exception
均不为值 Exception Exception Exception Exception
均为 0 允许 允许 允许 允许

允许 Move 操作并不意味着该操作将成功找到记录。 它仅表示允许尝试执行指定的 Move 操作且不生成异常。 IsBOFIsEOF 成员函数的值可能因尝试移动而更改。

下表显示了找不到记录的 Move 操作对 IsBOFIsEOF 设置值的影响。

操作 IsBOF IsEOF
MoveFirstMoveLast 非零 非零
Move 0 没有变化 没有变化
MovePrev, Move< 0 非零 没有变化
MoveNext, Move> 0 没有变化 非零

有关信息,请参阅 DAO 帮助中的主题“BOF、EOF 属性”。

CDaoRecordset::IsFieldDirty

调用此成员函数可确定动态集的指定字段数据成员是否已标记为“脏”(已更改)。

BOOL IsFieldDirty(void* pv);

参数

pv
指向要检查其状态的字段数据成员的指针,或用于确定是否有脏字段的 NULL。

返回值

如果指定的字段数据成员标记为脏,则返回非零值;否则返回 0。

注解

当通过调用 CDaoRecordsetUpdate 成员函数(在调用 EditAddNew 之后)更新当前记录时,所有脏字段数据成员中的数据都将被转移到数据源上的记录。 了解到这一点后,可以采取进一步的步骤,例如取消标记字段数据成员以标记列,使其不会写入到数据源。

IsFieldDirty 通过 DoFieldExchange 实现。

CDaoRecordset::IsFieldNull

调用此成员函数可确定记录集的指定字段数据成员是否已标记为 Null。

BOOL IsFieldNull(void* pv);

参数

pv
指向要检查其状态的字段数据成员的指针,或用于确定是否有 Null 字段的 NULL。

返回值

如果指定的字段数据成员标记为 Null,则返回非零值;否则返回 0。

注解

(在数据库术语中,Null 表示“没有值”,并且与 C++ 中的 NULL 不同。)如果字段数据成员标记为 Null,则会将其解释为当前记录中没有值的列。

注意

在某些情况下,使用 IsFieldNull 可能效率低下,如以下代码示例所示:

COleVariant varValue;
void *pField = &(rs.m_Age);
int nField = 2;

// this code is inefficient because data
// must be retrieved for both IsFieldNull
// and GetFieldValue
if (!rs.IsFieldNull(pField))
   rs.GetFieldValue(nField, varValue);

// this code is more efficient
rs.GetFieldValue(nField, varValue);
if (varValue.vt == VT_NULL)
   varValue.Attach(varNewVal); // do something

注意

如果使用动态记录绑定而不是从 CDaoRecordset 派生,请务必使用示例中所示的 VT_NULL。

CDaoRecordset::IsFieldNullable

调用此成员函数可确定指定的字段数据成员是否“可为 null”(可设置为 Null 值;C++ NULL 与 Null 不同,后者在数据库术语中表示“没有值”)。

BOOL IsFieldNullable(void* pv);

参数

pv
指向要检查其状态的字段数据成员的指针,或用于确定是否有 Null 字段的 NULL。

返回值

如果指定的字段数据成员可设为 Null,则返回非零值;否则返回 0。

备注

不可为 Null 的字段必须有值。 如果在添加或更新记录时尝试将此类字段设置为 Null,数据源将拒绝添加或更新,且 Update 会引发异常。 调用 Update 时发生异常,而不是在调用 SetFieldNull 时发生。

CDaoRecordset::IsOpen

调用此成员函数可确定记录集是否已打开。

BOOL IsOpen() const;

返回值

如果记录集对象的 OpenRequery 成员函数以前已调用且记录集尚未关闭,则返回非零值;否则返回 0。

备注

CDaoRecordset::m_bCheckCacheForDirtyFields

包含一个标志,指示缓存的字段是否自动标记为脏(已更改)和 Null。

注解

该标志默认为 TRUE。 此数据成员中的设置控制整个双重缓冲机制。 如果将该标志设置为 TRUE,则可以使用 DFX 机制按字段关闭缓存。 如果将该标志设置为 FALSE,必须自行调用 SetFieldDirtySetFieldNull

请在调用 Open 之前设置此数据成员。 此机制主要是为了方便使用而设计的。 由于在做出更改时需要对字段进行双重缓冲,因此性能可能变慢。

CDaoRecordset::m_nFields

包含记录集类中的字段数据成员数,以及记录集从数据源中选择的列数。

注解

记录集类的构造函数必须使用正确数量的静态绑定字段来初始化 m_nFields。 当你使用 ClassWizard 来声明记录集类时,它会为你编写此初始化。 你也可以手动编写此初始化。

框架使用此数字来管理字段数据成员与数据源上当前记录的相应列之间的交互。

注意

该数字必须与使用 CDaoFieldExchange::outputColumn 参数调用 SetFieldType 后在 DoFieldExchange 中注册的输出列数相对应。

可以通过 CDaoRecordset::GetFieldValueCDaoRecordset::SetFieldValue 动态绑定列。 这样就不需要递增 m_nFields 中的计数来反映 DoFieldExchange 成员函数中的 DFX 函数调用次数。

CDaoRecordset::m_nParams

包含记录集类中参数数据成员的数量 — 与记录集查询一起传递的参数数量。

注解

如果记录集类具有任何参数数据成员,则类的构造函数必须用正确数字初始化 m_nParams。 m_nParams 的值默认为 0。 如果添加参数数据成员(必须手动添加),还必须在类构造函数中手动添加初始化,以反映参数数量(必须至少与 m_strFilter 或 m_strSort 字符串中的 '' 占位符的数量相同)。

框架在参数化记录集的查询时使用此数字。

注意

该数字必须与使用 CFieldExchange::param 参数调用 SetFieldType 后在 DoFieldExchange 中注册的“参数”数量相对应。

有关信息,请参阅 DAO 帮助中的主题“Parameter 对象”。

CDaoRecordset::m_pDAORecordset

包含一个指向 CDaoRecordset 对象基础的 DAO 记录集对象的 OLE 接口的指针。

备注

如果需要直接访问 DAO 接口,请使用此指针。

有关信息,请参阅 DAO 帮助中的主题“记录集对象”。

CDaoRecordset::m_pDatabase

包含指向 CDaoDatabase 对象的指针,记录集通过该对象连接到数据源。

注解

此变量有两种设置方式。 通常,构造记录集对象时,会将指针传递给已打开的 CDaoDatabase 对象。 如果改为传递 NULL,CDaoRecordset 将为你创建 CDaoDatabase 对象并打开它。 在这两种情况下,CDaoRecordset 将指针存储在此变量中。

通常,你不需要直接使用存储在 m_pDatabase 中的指针。 但是,如果编写自己的 CDaoRecordset 扩展,则可能需要使用指针。 例如,如果你引发自己的 CDaoException,则可能需要指针。

有关信息,请参阅 DAO 帮助中的主题“数据库对象”。

CDaoRecordset::m_strFilter

包含用于构造 SQL 语句的 WHERE 子句的字符串

备注

它不包含用于筛选记录集的保留字 WHERE。 此数据成员不适用于表类型记录集。 使用 CDaoQueryDef 指针打开记录集时,使用 m_strFilter 不起作用。

当筛选包含日期的字段时,请使用美国日期格式(月-日-年),即使使用的不是美国版 Microsoft Jet 数据库引擎;否则,可能无法按预期方式筛选数据。

有关信息,请参阅 DAO 帮助中的主题“Filter 属性”。

CDaoRecordset::m_strSort

包含一个字符串,其中包含不带保留字 ORDERBY 的 SQL 语句的 ORDERBY 子句

备注

可对动态集和快照类型记录集对象进行排序。

无法对表类型记录集对象进行排序。 若要确定表类型记录集的排序顺序,请调用 SetCurrentIndex

使用 CDaoQueryDef 指针打开记录集时,使用 m_strSort 不起作用

有关信息,请参阅 DAO 帮助中的主题“Sort 属性”。

CDaoRecordset::Move

调用此成员函数可从当前记录定位记录集 lRows 记录

virtual void Move(long lRows);

参数

lRows
要向前或向后移动的记录数。 正值朝记录集末尾向前移动。 负值朝开头向后移动。

注解

可以向前或向后移动。 Move( 1 ) 等效于 MoveNextMove( -1 ) 等效于 MovePrev

注意

如果记录集没有记录,则调用任何 Move 函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOFIsEOF 可确定记录集是否包含任何记录。 调用 OpenRequery 后,调用 IsBOFIsEOF

注意

如果滚动范围超过记录集的开头或末尾(IsBOFIsEOF 返回非零值),则调用 Move 将引发 CDaoException

注意

如果在更新或添加当前记录时调用任何 Move 函数,更新将丢失,而不会发出警告。

对仅限前向滚动的快照调用 Move 时,lRows 参数必须是正整数,并且不允许使用书签,因此只能向前移动

若要将记录集中的第一条、最后一条、下一条或上一条记录设为当前记录,请调用 MoveFirstMoveLastMoveNextMovePrev 成员函数。

有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。

CDaoRecordset::MoveFirst

调用此成员函数可将记录集中的第一条记录(如果有)设为当前记录。

void MoveFirst();

注解

打开记录集后,无需立即调用 MoveFirst。 此时,第一条记录(如果有)将自动成为当前记录。

注意

如果记录集没有记录,则调用任何 Move 函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOFIsEOF 可确定记录集是否包含任何记录。 调用 OpenRequery 后,调用 IsBOFIsEOF

注意

如果在更新或添加当前记录时调用任何 Move 函数,更新将丢失,而不会发出警告。

使用 Move 函数在不应用条件的情况下从一条记录移到另一条记录。 使用 Find 操作来查找动态集类型或快照类型记录集对象中满足特定条件的记录。 若要在表类型记录集对象中查找记录,请调用 Seek

如果记录集引用表类型记录集,则移动操作遵循表的当前索引。 可以使用基础 DAO 对象的 Index 属性设置当前索引。 如果不设置当前索引,则返回记录的顺序是不确定的。

如果基于 SQL 查询或 querydef 对记录集对象调用 MoveLast,则查询将被强制完成,并且记录集对象会完全填充。

无法对仅限前向滚动的快照调用 MoveFirstMovePrev 成员函数。

若要将记录集对象中当前记录的位置向前或向后移动特定数量的记录,请调用 Move

有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。

CDaoRecordset::MoveLast

调用此成员函数可将记录集中的最后一条记录(如果有)设为当前记录。

void MoveLast();

备注

注意

如果记录集没有记录,则调用任何 Move 函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOFIsEOF 可确定记录集是否包含任何记录。 调用 OpenRequery 后,调用 IsBOFIsEOF

注意

如果在更新或添加当前记录时调用任何 Move 函数,更新将丢失,而不会发出警告。

使用 Move 函数在不应用条件的情况下从一条记录移到另一条记录。 使用 Find 操作来查找动态集类型或快照类型记录集对象中满足特定条件的记录。 若要在表类型记录集对象中查找记录,请调用 Seek

如果记录集引用表类型记录集,则移动操作遵循表的当前索引。 可以使用基础 DAO 对象的 Index 属性设置当前索引。 如果不设置当前索引,则返回记录的顺序是不确定的。

如果基于 SQL 查询或 querydef 对记录集对象调用 MoveLast,则查询将被强制完成,并且记录集对象会完全填充。

若要将记录集对象中当前记录的位置向前或向后移动特定数量的记录,请调用 Move

有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。

CDaoRecordset::MoveNext

调用此成员函数可将记录集中的下一条记录设为当前记录。

void MoveNext();

注解

建议在尝试移到上一条记录之前调用 IsBOF。 如果 IsBOF 返回非零值,则对 MovePrev 的调用将引发 CDaoException,指示已在第一条记录之前滚动,或者记录集未选择任何记录。

注意

如果记录集没有记录,则调用任何 Move 函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOFIsEOF 可确定记录集是否包含任何记录。 调用 OpenRequery 后,调用 IsBOFIsEOF

注意

如果在更新或添加当前记录时调用任何 Move 函数,更新将丢失,而不会发出警告。

使用 Move 函数在不应用条件的情况下从一条记录移到另一条记录。 使用 Find 操作来查找动态集类型或快照类型记录集对象中满足特定条件的记录。 若要在表类型记录集对象中查找记录,请调用 Seek

如果记录集引用表类型记录集,则移动操作遵循表的当前索引。 可以使用基础 DAO 对象的 Index 属性设置当前索引。 如果不设置当前索引,则返回记录的顺序是不确定的。

若要将记录集对象中当前记录的位置向前或向后移动特定数量的记录,请调用 Move

有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。

CDaoRecordset::MovePrev

调用此成员函数可将记录集中的上一条记录设为当前记录。

void MovePrev();

备注

建议在尝试移到上一条记录之前调用 IsBOF。 如果 IsBOF 返回非零值,则对 MovePrev 的调用将引发 CDaoException,指示已在第一条记录之前滚动,或者记录集未选择任何记录。

注意

如果记录集没有记录,则调用任何 Move 函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOFIsEOF 可确定记录集是否包含任何记录。 调用 OpenRequery 后,调用 IsBOFIsEOF

注意

如果在更新或添加当前记录时调用任何 Move 函数,更新将丢失,而不会发出警告。

使用 Move 函数在不应用条件的情况下从一条记录移到另一条记录。 使用 Find 操作来查找动态集类型或快照类型记录集对象中满足特定条件的记录。 若要在表类型记录集对象中查找记录,请调用 Seek

如果记录集引用表类型记录集,则移动操作遵循表的当前索引。 可以使用基础 DAO 对象的 Index 属性设置当前索引。 如果不设置当前索引,则返回记录的顺序是不确定的。

无法对仅限前向滚动的快照调用 MoveFirstMovePrev 成员函数。

若要将记录集对象中当前记录的位置向前或向后移动特定数量的记录,请调用 Move

有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。

CDaoRecordset::Open

必须调用此成员函数来检索记录集的记录。

virtual void Open(
    int nOpenType = AFX_DAO_USE_DEFAULT_TYPE,
    LPCTSTR lpszSQL = NULL,
    int nOptions = 0);

virtual void Open(
    CDaoTableDef* pTableDef,
    int nOpenType = dbOpenTable,
    int nOptions = 0);

virtual void Open(
    CDaoQueryDef* pQueryDef,
    int nOpenType = dbOpenDynaset,
    int nOptions = 0);

参数

nOpenType
以下值之一:

  • dbOpenDynaset 支持双向滚动的动态集类型记录集。 这是默认情况。

  • dbOpenTable 支持双向滚动的表类型记录集。

  • dbOpenSnapshot 支持双向滚动的快照类型记录集。

lpszSQL
包含下列项之一的字符串指针:

  • NULL 指针。

  • 一个或多个 tabledef 和/或 querydef 的名称(以逗号分隔)。

  • SQL SELECT 语句(可以选择使用 SQL WHERE 或 ORDERBY 子句)

  • 传递查询。

nOptions
下面列出的一个或多个选项。 默认值为 0。 可能的值如下所示:

  • dbAppendOnly 只能追加新记录(仅限动态集类型记录集)。 此选项的字面意思是只能追加记录。 MFC ODBC 数据库类有一个用于检索和追加记录的仅追加选项。

  • dbForwardOnly 记录集是仅限前向滚动的快照。

  • dbSeeChanges 如果其他用户正在更改你正在编辑的数据,则会生成异常。

  • dbDenyWrite 其他用户无法修改或添加记录。

  • dbDenyRead 其他用户无法查看记录(仅限表类型记录集)。

  • dbReadOnly 你只能查看记录;其他用户可以修改记录。

  • dbInconsistent 允许不一致的更新(仅限动态集类型记录集)。

  • dbConsistent 只允许一致的更新(仅限动态集类型记录集)。

注意

常量 dbConsistentdbInconsistent 是互斥的。 可以在给定的 Open 实例中使用其中的一个,而不能同时使用这两个常量。

pTableDef
指向 CDaoTableDef 对象的指针。 此版本仅对表类型记录集有效。 使用此选项时,不会使用用于构造 CDaoRecordsetCDaoDatabase 指针,而是使用 tabledef 所在的数据库。

pQueryDef
指向 CDaoQueryDef 对象的指针。 此版本仅对动态集类型和快照类型记录集有效。 使用此选项时,不会使用用于构造 CDaoRecordsetCDaoDatabase 指针,而是使用 querydef 所在的数据库。

备注

在调用 Open 之前,必须构造记录集对象。 有若干方法可实现此操作:

  • 构造记录集对象时,请传递指向已打开的 CDaoDatabase 对象的指针。

  • 构造记录集对象时,请传递指向未打开的 CDaoDatabase 对象的指针。 记录集会打开 CDaoDatabase 对象,但当记录集对象关闭时不会将其关闭。

  • 构造记录集对象时,请传递 NULL 指针。 记录集对象调用 GetDefaultDBName 以获取要打开的 Microsoft Access .MDB 文件的名称。 然后记录集打开 CDaoDatabase 对象,并在记录集打开时将该对象保持打开状态。 对记录集调用 Close 时,CDaoDatabase 对象也会关闭。

    注意

    当记录集打开 CDaoDatabase 对象时,它会打开具有非独占访问权限的数据源。

对于使用 lpszSQL 参数的 Open 版本,在打开记录集后,可以通过多种方式之一检索记录。 第一个选项是在 DoFieldExchange 中使用 DFX 函数。 第二个选项是通过调用 GetFieldValue 成员函数来使用动态绑定。 这些选项可以单独实现,也可以组合在一起实现。 如果将它们组合在一起,则必须在调用 Open 时自行传递 SQL 语句。

使用在其中传入 CDaoTableDef 对象的第二个 Open 版本时,可以通过 DoFieldExchange 和 DFX 机制绑定生成的列,和/或通过 GetFieldValue 动态绑定这些列。

注意

对于表类型记录集,只能使用 CDaoTableDef 对象调用 Open

使用在其中传入 CDaoQueryDef 对象的第三个 Open 版本时,将执行该查询,可以通过 DoFieldExchange 和 DFX 机制绑定生成的列,和/或通过 GetFieldValue 动态绑定这些列。

注意

对于动态集类型和快照类型记录集,只能使用 CDaoQueryDef 对象调用 Open

对于使用 lpszSQL 参数的第一个 Open 版本,将根据下表中显示的条件选择记录。

lpszSQL 参数的值 所选记录的确定方式 示例
Null GetDefaultSQL 返回的字符串。
一个或多个 tabledef 和/或 querydef 名称的逗号分隔列表。 DoFieldExchange 中表示的所有列。 "Customer"
SELECT 列列表 FROM 表列表 指定的 tabledef 和/或 querydef 中的指定列。 "SELECT CustId, CustName

FROM Customer"

一般过程是将 NULL 传递给 Open;在这种情况下,Open 调用 GetDefaultSQL,即 ClassWizard 在创建 CDaoRecordset 派生类时生成的可重写成员函数。 此值提供你在 ClassWizard 中指定的 tabledef 和/或 querydef 名称。 可以改为在 lpszSQL 参数中指定其他信息

无论传递什么,Open 都会为查询构造最终的 SQL 字符串(该字符串可能将 SQL WHERE 和 ORDERBY 子句追加到传递的 lpszSQL 字符串),然后执行查询。 可以通过调用 Open 后调用 GetSQL 来检查构造的字符串。

记录集类的字段数据成员绑定到所选数据列。 如果返回任何记录,则第一条记录将成为当前记录。

如果要为记录集设置选项(例如筛选器或排序),请在构造记录集对象之后、调用 Open 之前设置 m_strSortm_strFilter。 如果要在记录集打开后刷新记录集中的记录,请调用 Requery

如果对动态集类型或快照类型记录集调用 Open,或者数据源引用 SQL 语句或引用表示附加表的 tabledef,则不能将 dbOpenTable 用于类型参数;否则 MFC 将引发异常。 若要确定 tabledef 对象是否表示附加表,请创建 CDaoTableDef 对象并调用其 GetConnect 成员函数。

如果你希望在编辑或删除同一条记录时捕获其他用户或计算机上的其他程序所做的更改,请使用 dbSeeChanges 标志。 例如,如果两个用户开始编辑同一条记录,则第一个调用 Update 成员函数的用户将会成功。 第二个用户调用 Update 时会引发 CDaoException。 同样,如果第二个用户尝试调用 Delete 来删除记录,而该记录已由第一个用户更改,则会发生 CDaoException

通常,如果用户在更新时收到此 CDaoException,则代码应会刷新字段的内容并检索新修改的值。 如果在删除过程中发生异常,代码可以向用户显示新的记录数据,并显示一条消息来指出数据最近已更改。 此时,代码可以请求确认用户仍要删除该记录。

提示

当应用程序通过从 ODBC 数据源打开的记录集进行单次传递时,请使用仅限向前滚动选项 (dbForwardOnly) 来提高性能。

有关信息,请参阅 DAO 帮助中的主题“OpenRecordset 方法”。

CDaoRecordset::Requery

调用此成员函数可重新生成(刷新)记录集。

virtual void Requery();

备注

如果返回任何记录,则第一条记录将成为当前记录。

为了使记录集反映你或其他用户对数据源进行的添加和删除,必须通过调用 Requery 重新生成记录集。 如果记录集是动态集,它会自动反映你或其他用户对其现有记录所做的更新(但不是添加)。 如果记录集是快照,则必须调用 Requery 来反映其他用户的编辑以及添加和删除。

对于动态集或快照,每当你要使用参数值重新生成记录集时,请调用 Requery。 通过在调用 Requery 之前设置 m_strFilter 和 m_strSort 设置新筛选器或排序。 通过在调用 Requery 之前将新值分配给参数数据成员来设置新参数。

如果尝试重新生成记录集失败,则会关闭记录集。 在调用 Requery 之前,可以通过调用 CanRestart 成员函数来确定是否可以重新查询记录集。 CanRestart 不保证 Requery 成功。

注意

仅在调用 Open 后调用 Requery

注意

调用 Requery 会更改 DAO 书签。

如果调用 CanRestart 返回 0,则不能对动态集类型或快照类型记录集调用 Requery;此外不能对表类型记录集使用它。

如果在调用 RequeryIsBOFIsEOF 均返回非零值,则表示查询未返回任何记录,并且记录集不包含任何数据。

有关信息,请参阅 DAO 帮助中的主题“Requery 方法”。

CDaoRecordset::Seek

调用此成员函数可在满足当前索引的指定条件的索引表类型记录集对象中查找记录,并将该记录设为当前记录。

BOOL Seek(
    LPCTSTR lpszComparison,
    COleVariant* pKey1,
    COleVariant* pKey2 = NULL,
    COleVariant* pKey3 = NULL);

BOOL Seek(
    LPCTSTR lpszComparison,
    COleVariant* pKeyArray,
    WORD nKeys);

参数

lpszComparison
以下字符串表达式之一:“<”、“<=”、“=”、“>=”或“>”。

pKey1
指向其值对应于索引中第一个字段的 COleVariant 的指针。 必需。

pKey2
指向其值对应于索引中第二个字段(如果有)的 COleVariant 的指针。 默认为 NULL。

pKey3
指向其值对应于索引中第三个字段(如果有)的 COleVariant 的指针。 默认为 NULL。

pKeyArray
指向变体数组的指针。 数组大小对应于索引中的字段数。

nKeys
一个对应于数组大小的整数,即索引中的字段数。

注意

不要在键中指定通配符。 通配符将导致 Seek 不返回匹配的记录。

返回值

如果找到匹配的记录,则返回非零值;否则返回 0。

注解

使用 Seek 的第二个(数组)版本来处理四个或更多字段的索引。

使用 Seek 可对表类型记录集执行高性能的索引搜索。 必须在调用 Seek 之前通过调用 SetCurrentIndex 来设置当前索引。 如果索引标识了一个或多个非唯一键字段,Seek 将查找满足条件的第一条记录。 如果未设置索引,则会引发异常。

请注意,如果不创建 UNICODE 记录集,则 COleVariant 对象必须显式声明为 ANSI。 为此,可以使用 COleVariant::COleVariant(lpszSrc,vtSrc) 形式的构造函数并将 vtSrc 设置为 VT_BSTRT (ANSI),或使用 COleVariant 函数 SetString(lpszSrc,vtSrc) 并将 vtSrc 设置为 VT_BSTRT

调用 Seek 时,请传递一个或多个键值和一个比较运算符(“<”、“<="、“=”、“>=”或“>”)。 Seek 搜索指定的键字段并查找满足 lpszComparison 和 pKey1 指定的条件的第一条记录。 如果找到,Seek 将返回非零值,并将该记录设为当前记录。 如果 Seek 找不到匹配项,则 Seek 返回零,并且当前记录是未定义的。 直接使用 DAO 时,必须显式检查 NoMatch 属性。

如果 lpszComparison 为“=”、“>=”或“>”,则 Seek 从索引的开头开始。 如果 lpszComparison 为“<”或“<=”,则 Seek 从索引末尾开始并向后搜索,除非末尾有重复的索引条目。 在这种情况下,Seek 从索引末尾的重复索引条目中的任意条目开始。

使用 Seek 时不必存在当前记录。

若要在动态集类型或快照类型记录集中查找满足特定条件的记录,请使用 Find 操作。 若要包括所有记录而不仅仅是满足特定条件的记录,请使用 Move 操作在不同的记录之间移动。

不能对任何类型的附加表调用 Seek,因为附加表必须作为动态集类型或快照类型记录集打开。 但是,如果调用 CDaoDatabase::Open 以直接打开可安装的 ISAM 数据库,则可以对该数据库中的表调用 Seek,不过速度可能很慢。

有关信息,请参阅 DAO 帮助中的主题“Seek 方法”。

CDaoRecordset::SetAbsolutePosition

设置记录集对象的当前记录的相对记录编号。

void SetAbsolutePosition(long lPosition);

参数

lPosition
对应于当前记录在记录集中的序号位置。

备注

调用 SetAbsolutePosition 可根据特定记录在动态集类型或快照类型记录集中的序号位置将当前记录指针定位到该记录。 还可以通过调用 GetAbsolutePosition 来确定当前记录编号。

注意

此成员函数仅对动态集类型和快照类型记录集有效。

基础 DAO 对象的 AbsolutePosition 属性值从零开始;设置为 0 表示记录集中的第一条记录。 设置大于填充记录数的值会导致 MFC 引发异常。 可以通过调用 GetRecordCount 成员函数来确定记录集中填充的记录数。

如果删除了当前记录,则不会定义 AbsolutePosition 属性值,并且 MFC 会引发异常(如果已引用)。 新记录将添加到序列的末尾。

注意

此属性不旨在用作代理项记录编号。 书签仍然是保留和返回给定位置的建议方式,并且是在支持书签的所有类型的记录集对象中定位当前记录的唯一方式。 具体而言,给定记录的位置会在删除其前面的记录时更改。 此外,如果再次重新创建记录集,则无法确保给定记录集具有相同的绝对位置,因为不能保证记录集中各个记录的顺序,除非使用 ORDERBY 子句通过 SQL 语句创建记录集

有关信息,请参阅 DAO 帮助中的主题“AbsolutePosition 属性”。

CDaoRecordset::SetBookmark

调用此成员函数可将记录集定位在包含指定书签的记录上。

void SetBookmark(COleVariant varBookmark);

参数

varBookmark
包含特定记录的书签值的 COleVariant 对象。

备注

创建或打开某个记录集对象时,该记录集的每条记录已有一个唯一的书签。 可以通过调用 GetBookmark 并将值保存到 COleVariant 对象来检索当前记录的书签。 稍后可以通过调用 SetBookmark 使用已保存的书签值返回到该记录。

注意

调用 Requery 会更改 DAO 书签。

请注意,如果不创建 UNICODE 记录集,则 COleVariant 对象必须显式声明为 ANSI。 为此,可以使用 COleVariant::COleVariant(lpszSrc,vtSrc) 形式的构造函数并将 vtSrc 设置为 VT_BSTRT (ANSI),或使用 COleVariant 函数 SetString(lpszSrc,vtSrc) 并将 vtSrc 设置为 VT_BSTRT

有关信息,请参阅 DAO 帮助中的主题“Bookmark 属性”和“Bookmarkable 属性”。

CDaoRecordset::SetCacheSize

调用此成员函数可设置要缓存的记录数。

void SetCacheSize(long lSize);

参数

lSize
指定记录数。 典型值为 100。 设置为 0 会关闭缓存。 必须设置为 5 到 1200 条记录。 缓存可能会占用大量内存。

注解

缓存是本地内存中的空间,用于保存最近从服务器检索的数据(如果在应用程序运行时再次请求该数据)。 数据缓存提高了通过动态集类型记录集对象从远程服务器检索数据的应用程序的性能。 请求数据时,Microsoft Jet 数据库引擎首先会在缓存中检查请求的数据,而不是从服务器检索数据,这需要更多时间。 不是来自 ODBC 数据源的数据不会保存在缓存中。

任何 ODBC 数据源(例如附加的表)都可以有本地缓存。 若要创建缓存,请从远程数据源打开一个记录集对象,调用 SetCacheSizeSetCacheStart 成员函数,然后调用 FillCache 成员函数或使用 Move 操作之一在记录之间移动。 SetCacheSize 成员函数的 lSize 参数可以基于应用程序一次可处理的记录数。 例如,如果使用记录集作为要在屏幕上显示的数据的源,可以传递值为 20 的 SetCacheSizelSize 参数以一次显示 20 条记录

有关信息,请参阅 DAO 帮助中的主题“CacheSize、CacheStart 属性”。

CDaoRecordset::SetCacheStart

调用此成员函数可指定要缓存的记录集中第一条记录的书签。

void SetCacheStart(COleVariant varBookmark);

参数

varBookmark
一个 COleVariant,指定要缓存的记录集中第一条记录的书签。

注解

可将任何记录的书签值用于 SetCacheStart 成员函数的 varBookmark 参数。 使用当前记录创建要启动缓存的记录,使用 SetBookmark 为该记录建立书签,并将书签值作为 SetCacheStart 成员函数的参数传递。

Microsoft Jet 数据库引擎从缓存请求缓存范围内的记录,并从服务器请求缓存范围以外的记录。

从缓存中检索的记录不反映其他用户同时对源数据所做的更改。

若要强制更新所有已缓存的数据,请传递 SetCacheSize 的 lSize 参数并将其值指定为 0,使用最初请求的缓存大小再次调用 SetCacheSize,然后调用 FillCache 成员函数

请注意,如果不创建 UNICODE 记录集,则 COleVariant 对象必须显式声明为 ANSI。 为此,可以使用 COleVariant::COleVariant(lpszSrc,vtSrc) 形式的构造函数并将 vtSrc 设置为 VT_BSTRT (ANSI),或使用 COleVariant 函数 SetString(lpszSrc,vtSrc) 并将 vtSrc 设置为 VT_BSTRT

有关信息,请参阅 DAO 帮助中的主题“CacheSize、CacheStart 属性”。

CDaoRecordset::SetCurrentIndex

调用此成员函数可在表类型记录集上设置索引。

void SetCurrentIndex(LPCTSTR lpszIndex);

参数

lpszIndex
包含要设置的索引的名称的指针。

注解

基表中的记录不按任何特定顺序存储。 设置索引会更改从数据库返回记录的顺序,但不影响记录的存储顺序。 指定的索引必须已定义。 如果你尝试使用不存在的索引对象,或者在调用 Seek 时未设置索引,则 MFC 将引发异常。

可以通过调用 CDaoTableDef::CreateIndex 为表创建新索引,并通过调用 CDaoTableDef::Append 将新索引追加到基础 tabledef 的 Indexes 集合,然后重新打开记录集。

从表类型记录集返回的记录只能按为基础 tabledef 定义的索引排序。 若要按其他顺序对记录进行排序,可以使用 SQL ORDERBY 子句打开存储在 CDaoRecordset::m_strSort 中的动态集类型或快照类型记录集

有关信息,请参阅 DAO 帮助中的主题“索引对象”和定义“当前索引”。

CDaoRecordset::SetFieldDirty

调用此成员函数可将记录集的字段数据成员标记为已更改或未更改。

void SetFieldDirty(
    void* pv,
    BOOL bDirty = TRUE);

参数

pv
包含记录集中字段数据成员的地址,或 NULL。 如果为 NULL,则会标记记录集中的所有字段数据成员。 (C++ NULL 与数据库术语中的 Null 不同,后者表示“没有值”。)

bDirty
如果字段数据成员标记为“脏”(已更改),则为 TRUE。 如果字段数据成员标记为“干净”(未更改),则为 FALSE。

备注

将字段标记为未更改可确保不会更新该字段。

框架标记更改的字段数据成员,以确保它们通过 DAO 记录字段交换 (DFX) 机制写入到数据源中的记录。 更改字段的值通常会自动将字段设置为“脏”,因此很少需要自行调用 SetFieldDirty,但有时你可能希望确保无论字段数据成员中的值是什么,都会显式更新或插入列。 DFX 机制还采用 PSEUDONULL。 有关详细信息,请参阅 CDaoFieldExchange::m_nOperation

如果未使用双重缓冲机制,则更改字段的值不会自动将该字段设置为脏字段。 在这种情况下,需要显式将字段设置为脏字段。 m_bCheckCacheForDirtyFields 中包含的标志控制此自动字段检查。

注意

请仅在调用 EditAddNew 后调用此成员函数。

对函数的第一个参数使用 NULL 会将该函数应用于所有 outputColumn 字段,而不是 CDaoFieldExchange 中的 param 字段。 例如,调用

SetFieldDirty(NULL);

只会将 outputColumn 字段设置为 NULL;param 字段不受影响

若要处理 param,必须提供要处理的单个 param 的实际地址,例如

SetFieldDirty(&m_strParam);

这意味着,不能像对 outputColumn 字段那样将所有 param 字段设置为 NULL

SetFieldDirty 通过 DoFieldExchange 实现。

CDaoRecordset::SetFieldNull

调用此成员函数可将记录集的字段数据成员标记为 Null(即没有值)或非 Null。

void SetFieldNull(
    void* pv,
    BOOL bNull = TRUE);

参数

pv
包含记录集中字段数据成员的地址,或 NULL。 如果为 NULL,则会标记记录集中的所有字段数据成员。 (C++ NULL 与数据库术语中的 Null 不同,后者表示“没有值”。)

bNull
如果将字段数据成员标记为没有值 (Null),则为非零值。 如果字段数据成员标记为“非 Null”,则为 0。

备注

SetFieldNull 用于 DoFieldExchange 机制中绑定的字段。

向记录集添加新记录时,所有字段数据成员最初都设置为 Null 值,并标记为“脏”(已更改)。 从数据源检索记录时,其列已有值或为 Null。 如果不适合将某个字段设为 Null,则会引发 CDaoException

如果使用双重缓冲机制(例如,如果你要特意将当前记录的某个字段指定为没有值),请调用 SetFieldNull 并将 bNull 设置为 TRUE,以将该字段标记为 Null。 如果字段之前标记为 Null,并且你现在想要为其指定一个值,只需设置其新值即可。 无需使用 SetFieldNull 删除 Null 标志。 若要确定是否允许字段为 Null,请调用 IsFieldNullable

如果未使用双重缓冲机制,则更改字段的值不会自动将该字段设置为脏字段且不为 Null。 必须专门将字段设置为脏字段且不为 Null。 m_bCheckCacheForDirtyFields 中包含的标志控制此自动字段检查。

DFX 机制采用 PSEUDONULL。 有关详细信息,请参阅 CDaoFieldExchange::m_nOperation

注意

请仅在调用 EditAddNew 后调用此成员函数。

对函数的第一个参数使用 NULL 会仅将该函数应用于 outputColumn 字段,而不是 CDaoFieldExchange 中的 param 字段。 例如,调用

SetFieldNull(NULL);

只会将 outputColumn 字段设置为 NULL;param 字段不受影响

CDaoRecordset::SetFieldValue

调用此成员函数可按序号位置或通过更改字符串值来设置字段的值。

virtual void SetFieldValue(
    LPCTSTR lpszName,
    const COleVariant& varValue);

virtual void SetFieldValue(
    int nIndex,
    const COleVariant& varValue);

void SetFieldValue(
    LPCTSTR lpszName,
    LPCTSTR lpszValue);

void SetFieldValue(
    int nIndex,
    LPCTSTR lpszValue);

参数

lpszName
指向包含字段名称的字符串的指针。

varValue
对包含字段内容值的 COleVariant 对象的引用。

nIndex
一个整数,表示记录集的 Fields 集合中字段的序号位置(从零开始)。

lpszValue
指向包含字段内容值的字符串的指针。

备注

请使用 SetFieldValueGetFieldValue 在运行时动态绑定字段,而不要使用 DoFieldExchange 机制静态绑定列。

请注意,如果不创建 UNICODE 记录集,则必须使用不包含 COleVariant 参数的 SetFieldValue 形式,或者必须将 COleVariant 对象显式声明为 ANSI。 为此,可以使用 COleVariant::COleVariant(lpszSrc,vtSrc) 形式的构造函数并将 vtSrc 设置为 VT_BSTRT (ANSI),或使用 COleVariant 函数 SetString(lpszSrc,vtSrc) 并将 vtSrc 设置为 VT_BSTRT

有关信息,请参阅 DAO 帮助中的主题“Field 对象”和“Value 属性”。

CDaoRecordset::SetFieldValueNull

调用此成员函数可将字段设置为 Null 值。

void SetFieldValueNull(int nIndex);
void SetFieldValueNull(LPCTSTR lpszName);

参数

nIndex
记录集中字段的索引,用于按从零开始的索引进行查找。

lpszName
记录集中字段的名称,用于按名称查找。

备注

C++ NULL 与数据库术语中的 Null 不同,后者表示“没有值”。

有关信息,请参阅 DAO 帮助中的主题“Field 对象”和“Value 属性”。

CDaoRecordset::SetLockingMode

调用此成员函数可设置记录集的锁定类型。

void SetLockingMode(BOOL bPessimistic);

参数

bPessimistic
指示锁定类型的标志。

备注

当悲观锁定生效时,一旦调用 Edit 成员函数,就会锁定包含你正在编辑的记录的 2K 页。 调用 UpdateClose 成员函数或者执行任何 Move 或 Find 操作时,会解锁该页。

如果乐观锁定生效,仅当使用 Update 成员函数更新记录时才锁定包含记录的 2K 页。

如果锁定了某个页,其他用户无法编辑该页上的记录。 如果调用 SetLockingMode 并传递一个非零值,而另一用户已锁定页,则在调用 Edit 时会引发异常。 其他用户可以从锁定的页中读取数据。

如果使用零值调用 SetLockingMode,然后在其他用户锁定了页的情况下调用 Update,则会发生异常。 若要查看另一用户对你的记录所做的更改(丢失更改),请使用当前记录的书签值调用 SetBookmark 成员函数。

使用 ODBC 数据源时,锁定模式始终为乐观。

CDaoRecordset::SetParamValue

调用此成员函数可在运行时在记录集中设置参数的值。

virtual void SetParamValue(
    int nIndex,
    const COleVariant& varValue);

virtual void SetParamValue(
    LPCTSTR lpszName,
    const COleVariant& varValue);

参数

nIndex
参数在 querydef 的参数集合中的编号位置。

var
要设置的值;请参阅“注解”。

lpszName
要设置其值的参数的名称。

备注

该参数必须已建立为记录集的 SQL 字符串的一部分。 可以按名称或按其在集合中的索引位置访问参数。

指定要设置为 COleVariant 对象的值。 有关在 COleVariant 对象中设置所需值和类型的信息,请参阅类 COleVariant。 请注意,如果不创建 UNICODE 记录集,则 COleVariant 对象必须显式声明为 ANSI。 为此,可以使用 COleVariant::COleVariant(lpszSrc,vtSrc) 形式的构造函数并将 vtSrc 设置为 VT_BSTRT (ANSI),或使用 COleVariant 函数 SetString(lpszSrc,vtSrc) 并将 vtSrc 设置为 VT_BSTRT

CDaoRecordset::SetParamValueNull

调用此成员函数可将参数设置为 Null 值。

void SetParamValueNull(int nIndex);
void SetParamValueNull(LPCTSTR lpszName);

参数

nIndex
记录集中字段的索引,用于按从零开始的索引进行查找。

lpszName
记录集中字段的名称,用于按名称查找。

注解

C++ NULL 与数据库术语中的 Null 不同,后者表示“没有值”。

CDaoRecordset::SetPercentPosition

调用此成员函数可设置一个值,该值根据记录集中记录的百分比更改当前记录在记录集对象中的大致位置。

void SetPercentPosition(float fPosition);

参数

fPosition
一个介于 0 和 100 之间的数字。

注解

使用动态集类型或快照类型记录集时,请先通过移到最后一条记录来填充记录集,然后再调用 SetPercentPosition。 如果在完全填充记录集之前调用 SetPercentPosition,则移动量与 GetRecordCount 值指示的访问记录数有关。 可以通过调用 MoveLast 移到最后一条记录。

调用 SetPercentPosition 后,与该值对应的大致位置处的记录将变为当前记录。

注意

不建议调用 SetPercentPosition 将当前记录移到记录集中的特定记录。 请改为调用 SetBookmark 成员函数。

有关信息,请参阅 DAO 帮助中的主题“PercentPosition 属性”。

CDaoRecordset::Update

调用 AddNewEdit 成员函数后调用此成员函数。

virtual void Update();

备注

完成 AddNewEdit 操作需要进行此调用。

AddNewEdit 都准备了一个编辑缓冲区,在其中放置添加或编辑的数据,以便保存到数据源。 Update 保存数据。 仅更新标记为或检测到“已更改”的字段。

如果数据源支持事务,则可以调用 Update(及其相应的 AddNewEdit 调用)作为事务的一部分。

注意

如果调用 Update 时没有事先调用 AddNewEdit,则 Update 将引发 CDaoException。 如果调用 AddNewEdit,则必须在调用 MoveNext 或者关闭记录集或数据源连接之前调用 Update。 否则,更改会丢失且没有通知。

当记录集对象在多用户环境中悲观锁定时,从使用 Edit 开始到更新完成的这段时间,记录将保持锁定状态。 如果记录集已乐观锁定,则记录将保持锁定,并与它在数据库中更新之前那一刻的编辑前记录进行比较。 如果记录在调用 Edit 后已更改,则 Update 操作将会失败,并且 MFC 会引发异常。 可以使用 SetLockingMode 来更改锁定模式。

注意

乐观锁定始终用于外部数据库格式,例如 ODBC 和可安装的 ISAM。

有关信息,请参阅 DAO 帮助中的主题“AddNew 方法”、“CancelUpdate 方法”、“Delete 方法”、“LastModified 属性”、“Update 方法”和“EditMode 属性”。

另请参阅

CObject 类
层次结构图
CDaoTableDef 类
CDaoWorkspace 类
CDaoDatabase 类
CDaoQueryDef 类