CDaoRecordset 类
表示从数据源选择的一组记录。
注意
通过 Office 2013 支持数据访问对象(DAO)。 DAO 3.6 是最终版本,已过时。
语法
class CDaoRecordset : public CObject
成员
公共构造函数
名称 | 描述 |
---|---|
CDaoRecordset::CDaoRecordset | 构造 CDaoRecordset 对象。 |
公共方法
名称 | 描述 |
---|---|
CDaoRecordset::AddNew | 准备添加新记录。 调用 Update 以完成添加。 |
CDaoRecordset::CanAppend | 如果可以通过 AddNew 成员函数将新记录添加到记录集中,则返回非零值。 |
CDaoRecordset::CanBookmark | 如果记录集支持书签,则返回非零值。 |
CDaoRecordset::CancelUpdate | 由于 Edit 或 AddNew 操作而取消任何挂起的更新。 |
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 | 通过在数据源上保存新数据或编辑的数据来完成 AddNew 或 Edit 操作。 |
公共数据成员
“属性” | 描述 |
---|---|
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
会从数据库中选择数据并检索第一条记录。
使用对象的成员函数和数据成员来滚动浏览记录并对其进行操作。 可用的操作取决于对象是表类型记录集、动态集类型记录集还是快照类型记录集,以及它是可更新的还是只读的, 这取决于数据库或 Open Database Connectivity (ODBC) 数据源的功能。 若要刷新自调用 Open
以来可能已更改或添加的记录,请调用对象的 Requery 成员函数。 调用对象的 Close
成员函数,并在使用结束时销毁该对象。
CDaoRecordset
使用 DAO 记录字段交换 (DFX) 来支持通过 CDaoRecordset
或 CDaoRecordset
派生类的类型安全 C++ 成员读取和更新记录字段。 还可以使用 GetFieldValue 和 SetFieldValue 实现数据库中列的动态绑定,而无需使用 DFX 机制。
有关信息,请参阅 DAO 帮助中的主题“记录集对象”。
继承层次结构
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
无法追加的记录集,则会引发 ACDaoException
。 可以通过调用 CanAppend 来确定记录集是否可更新。
框架标记更改的字段数据成员,以确保它们将由 DAO 记录字段交换 (DFX) 机制写入数据源上的记录。 更改字段的值通常会自动设置字段,因此你很少需要自己调用 SetFieldDirty ,但有时你可能希望确保显式更新或插入列,而不考虑字段数据成员中的值。 DFX 机制还采用 PSEUDO NULL。 有关详细信息,请参阅 CDaoFieldExchange::m_nOperation。
如果未使用双缓冲机制,则更改字段的值不会自动将字段设置为脏。 在这种情况下,必须显式设置字段脏。 m_bCheckCacheForDirtyFields 中包含的标志控制此自动字段检查。
注意
如果记录已双重缓冲(即启用了自动字段检查),则调用 CancelUpdate
会将成员变量还原为调用 AddNew
或 Edit
之前的值。
有关信息,请参阅 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
成员函数会由于 Edit 或 AddNew 操作而取消任何挂起的更新。
virtual void CancelUpdate();
注解
例如,如果应用程序调用Edit
或AddNew
成员函数且未调用Update
,CancelUpdate
则取消在调用或AddNew
调用后Edit
所做的任何更改。
注意
如果记录已双重缓冲(即启用了自动字段检查),则调用 CancelUpdate
会将成员变量还原为调用 AddNew
或 Edit
之前的值。
Edit
如果没有或AddNew
操作挂起,CancelUpdate
则会导致 MFC 引发异常。 调用 GetEditMode 成员函数以确定是否有可取消的挂起操作。
有关信息,请参阅 DAO 帮助中的主题“CancelUpdate 方法”。
CDaoRecordset::CanRestart
调用此成员函数可确定记录集是否允许通过调用 Requery
成员函数来重启查询(以刷新其记录)。
BOOL CanRestart();
返回值
如果可以调用 Requery
以再次运行记录集的查询,则返回非零值,否则返回 0。
注解
表类型记录集不支持 Requery
。
如果 Requery
不支持,请调用 Close ,然后 打开 以刷新数据。 更改参数值后,可以调用 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
同一数据源或其他数据源来重复使用该对象。
所有挂起的 AddNew 或 Edit 语句都将取消,所有挂起的事务都将回滚。 如果你要保留挂起的添加或编辑语句,请在对每个记录集调用 Close
之前调用 Update。
可以在调用 Close
后再次调用 Open
。 这样,便可以重复使用记录集对象。 如果可能,更好的替代做法是调用 Requery。
有关信息,请参阅 DAO 帮助中的主题“Close 方法”。
CDaoRecordset::Delete
调用此成员函数可删除已打开的动态集类型或表类型记录集对象中的当前记录。
virtual void Delete();
备注
成功删除后,记录集的字段数据成员将设置为 Null 值,必须显式调用记录集导航成员函数之一(Move、Seek、SetBookmark 等)以移除已删除的记录。 从记录集中删除记录时,在调用 Delete
之前记录集中必须存在当前记录;否则 MFC 将引发异常。
Delete
删除当前记录并使其不可访问。 虽然无法编辑或使用已删除的记录,但它仍保持最新状态。 但是,移动到另一条记录后,无法再次使已删除的记录保持最新状态。
注意
记录集必须可更新,并且调用 Delete
时记录集中必须存在有效的当前记录。 例如,如果删除记录,但在再次调用 Delete
之前不滚动到新记录, Delete
则会 引发 CDaoException。
如果使用事务并调用 CDaoWorkspace::Rollback 成员函数,则可以取消删除记录。 如果基表是级联删除关系中的主表,则删除当前记录也可能会删除外部表中的一条或多条记录。 有关详细信息,请参阅 DAO 帮助中的定义“级联删除”。
与 AddNew
和 Edit
不同,调用 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
,必须存在当前记录。 如果没有当前记录,或者记录集未引用打开的表类型或 dynaset 类型记录集对象,则会发生异常。 在以下情况下调用 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 数据库可以有本地缓存。 若要创建缓存,请从远程数据源打开记录集对象,然后调用记录集的 SetCacheSize
和 SetCacheStart
成员函数。 如果 lSize 和 lBookmark 创建一个部分或完全超出指定SetCacheSize
SetCacheStart
范围的范围,则忽略此范围之外的记录集部分,并且不会加载到缓存中。 如果 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
是一个虚拟函数,因此你可以重写它并添加自己的实现。 FindFirst
、FindLast
、FindNext
和 FindPrev
成员函数调用 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 操作与调用MoveFirst
MoveNext
不同,但是,这只会使第一条或下一条记录处于当前状态,而无需指定条件。 可以在执行 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 操作与调用MoveFirst
MoveNext
不同,但是,这只会使第一条或下一条记录处于当前状态,而无需指定条件。 可以在执行 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 操作与调用MoveFirst
MoveNext
不同,但是,这只会使第一条或下一条记录处于当前状态,而无需指定条件。 可以在执行 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 操作与调用MoveFirst
MoveNext
不同,但是,这只会使第一条或下一条记录处于当前状态,而无需指定条件。 可以在执行 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
对象的版本更为高效。 保留此函数的后一个版本是为了实现后向兼容。
请使用 GetFieldValue
和 SetFieldValue 在运行时动态绑定字段,而不要使用 DoFieldExchange 机制静态绑定列。
可以结合 GetFieldValue
和 DoFieldExchange
机制来提高性能。 例如,使用 GetFieldValue
仅按需检索所需的值,并将该调用分配到界面中的“详细信息”按钮。
有关信息,请参阅 DAO 帮助中的主题“Field 对象”和“Value 属性”。
CDaoRecordset::GetIndexCount
调用此成员函数可确定表类型记录集中提供的索引数。
short GetIndexCount();
返回值
表类型记录集中的索引数。
备注
GetIndexCount
可用于循环访问记录集中的所有索引。 为此,请 GetIndexCount
与 .一起使用 GetIndexInfo
。 如果对动态集类型或快照类型记录集调用此成员函数,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 成员函数后,将立即锁定包含正在编辑的记录的数据页。 调用 Update 或 Close 成员函数或者执行任何 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
。 如果没有当前记录,或者当前记录已被删除,则会引发 a CDaoException
。
有关信息,请参阅 DAO 帮助中的主题“PercentPosition 属性”。
CDaoRecordset::GetRecordCount
调用此成员函数可确定已访问记录集中的多少条记录。
long GetRecordCount();
返回值
返回在记录集对象中访问的记录数。
注解
GetRecordCount
在访问所有记录之前,不会指示动态集类型或快照类型记录集中包含的记录数。 此成员函数调用可能需要很长时间才能完成。
访问最后一条记录后,返回值将指示记录集中未删除记录的总数。 若要强制访问最后一条记录,请对记录集调用 MoveLast
或 FindLast
成员函数。 还可以使用 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_strFilter 和 m_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
返回非零值,则当前记录未定义,且任何需要当前记录的操作都将导致异常。
特定方法对 IsBOF
和 IsEOF
设置的影响:
在内部调用
Open*
会通过调用MoveFirst
将记录集中的第一条记录设为当前记录。 因此,对空记录集调用Open
会导致IsBOF
和IsEOF
返回非零值。 (有关失败的MoveFirst
或MoveLast
调用的行为,请参阅下表。)所有成功找到记录的 Move 操作都会导致
IsBOF
和IsEOF
返回 0。执行成功插入新记录的
AddNew
调用后接着执行Update
调用将导致IsBOF
返回 0,但前提是IsEOF
不为零。IsEOF
的状态始终保持不变。 根据 Microsoft Jet 数据库引擎的定义,空记录集的当前记录指针位于文件末尾,因此任何新记录将插入到当前记录之后。任何
Delete
调用(即使它从记录集中删除唯一的剩余记录)都不会更改或的值IsBOF
IsEOF
。
下表显示了允许对 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 | 允许 | 允许 | 允许 | 允许 |
允许移动操作并不意味着该操作将成功找到记录。 它只是指示允许尝试执行指定的移动操作,并且不会生成异常。 IsBOF
和 IsEOF
成员函数的值可能因尝试移动而更改。
下表显示了在值和IsEOF
设置上找不到记录的 IsBOF
Move 操作的效果。
Operations | IsBOF | IsEOF |
---|---|---|
MoveFirst , MoveLast |
非零 | 非零 |
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
返回非零值,则当前记录未定义,且任何需要当前记录的操作都将导致异常。
特定方法对 IsBOF
和 IsEOF
设置的影响:
在内部调用
Open
会通过调用MoveFirst
将记录集中的第一条记录设为当前记录。 因此,对空记录集调用Open
会导致IsBOF
和IsEOF
返回非零值。 (有关失败的MoveFirst
调用的行为,请参阅下表。)所有成功找到记录的 Move 操作都会导致
IsBOF
和IsEOF
返回 0。执行成功插入新记录的
AddNew
调用后接着执行Update
调用将导致IsBOF
返回 0,但前提是IsEOF
不为零。IsEOF
的状态始终保持不变。 根据 Microsoft Jet 数据库引擎的定义,空记录集的当前记录指针位于文件末尾,因此任何新记录将插入到当前记录之后。任何
Delete
调用(即使它从记录集中删除唯一的剩余记录)都不会更改或的值IsBOF
IsEOF
。
下表显示了允许对 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 | 允许 | 允许 | 允许 | 允许 |
允许移动操作并不意味着该操作将成功找到记录。 它只是指示允许尝试执行指定的移动操作,并且不会生成异常。 IsBOF
和 IsEOF
成员函数的值可能因尝试移动而更改。
下表显示了在值和IsEOF
设置上找不到记录的 IsBOF
Move 操作的效果。
Operations | IsBOF | IsEOF |
---|---|---|
MoveFirst , MoveLast |
非零 | 非零 |
Move 0 |
没有变化 | 没有变化 |
MovePrev , Move < 0 |
非零 | 没有变化 |
MoveNext , Move > 0 |
没有变化 | 非零 |
有关信息,请参阅 DAO 帮助中的主题“BOF、EOF 属性”。
CDaoRecordset::IsFieldDirty
调用此成员函数可确定动态集的指定字段数据成员是否已标记为“脏”(已更改)。
BOOL IsFieldDirty(void* pv);
参数
pv
指向要检查其状态的字段数据成员的指针,或用于确定是否有脏字段的 NULL。
返回值
如果指定的字段数据成员标记为脏,则返回非零值;否则返回 0。
注解
当通过调用 Update
或调用的成员函数 CDaoRecordset
Edit
AddNew
更新当前记录时,所有脏字段数据成员中的数据将传输到数据源上的记录。 通过此知识,可以采取进一步步骤,例如取消标记字段数据成员以标记列,以便不会将其写入数据源。
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;
返回值
如果记录集对象的 Open
或 Requery
成员函数以前已调用且记录集尚未关闭,则为非零值;否则为 0。
注解
CDaoRecordset::m_bCheckCacheForDirtyFields
包含一个标志,指示缓存的字段是否自动标记为脏(已更改)和 Null。
注解
该标志默认为 TRUE。 此数据成员中的设置控制整个双重缓冲机制。 如果将该标志设置为 TRUE,则可以使用 DFX 机制按字段关闭缓存。 如果将该标志设置为 FALSE,必须自行调用 SetFieldDirty
和 SetFieldNull
。
请在调用 Open
之前设置此数据成员。 此机制主要是为了方便使用而设计的。 由于在做出更改时需要对字段进行双重缓冲,因此性能可能变慢。
CDaoRecordset::m_nFields
包含记录集类中的字段数据成员数,以及记录集从数据源中选择的列数。
注解
记录集类的构造函数必须使用正确数量的静态绑定字段来初始化 m_nFields
。 当你使用 ClassWizard 来声明记录集类时,它会为你编写此初始化。 你也可以手动编写此初始化。
框架使用此数字来管理字段数据成员与数据源上当前记录的相应列之间的交互。
注意
该数字必须与使用 CDaoFieldExchange::outputColumn
参数调用 SetFieldType
后在 DoFieldExchange
中注册的输出列数相对应。
可以通过 CDaoRecordset::GetFieldValue
和 CDaoRecordset::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 )
等效于 MoveNext
,Move( -1 )
等效于 MovePrev
。
注意
如果记录集没有记录,则调用任何 Move
函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOF
和 IsEOF
可确定记录集是否包含任何记录。 调用 Open
或 Requery
后,调用 IsBOF
或 IsEOF
。
注意
如果滚动范围超过记录集的开头或末尾(IsBOF
或 IsEOF
返回非零值),则调用 Move
将引发 CDaoException
。
注意
如果在更新或添加当前记录时调用任何 Move
函数,更新将丢失,而不会发出警告。
调用 Move
仅向前滚动快照时, lRows 参数必须是正整数,不允许书签,因此只能向前移动。
若要将记录集中的第一条、最后一条、下一条或上一条记录设为当前记录,请调用 MoveFirst
、MoveLast
、MoveNext
或 MovePrev
成员函数。
有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。
CDaoRecordset::MoveFirst
调用此成员函数可将记录集中的第一条记录(如果有)设为当前记录。
void MoveFirst();
注解
打开记录集后,无需立即调用 MoveFirst
。 此时,第一条记录(如果有)将自动成为当前记录。
注意
如果记录集没有记录,则调用任何 Move
函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOF
和 IsEOF
可确定记录集是否包含任何记录。 调用 Open
或 Requery
后,调用 IsBOF
或 IsEOF
。
注意
如果在更新或添加当前记录时调用任何 Move
函数,更新将丢失,而不会发出警告。
使用 Move
函数在不应用条件的情况下从一条记录移到另一条记录。 使用 Find 操作来查找动态集类型或快照类型记录集对象中满足特定条件的记录。 若要在表类型记录集对象中查找记录,请调用 Seek
。
如果记录集引用表类型记录集,则移动操作遵循表的当前索引。 可以使用基础 DAO 对象的 Index 属性设置当前索引。 如果未设置当前索引,则返回的记录的顺序是未定义的。
如果基于 SQL 查询或 querydef 对记录集对象调用 MoveLast
,则查询将被强制完成,并且记录集对象会完全填充。
不能使用仅向前滚动快照调用 MoveFirst
或 MovePrev
成员函数。
若要将记录集对象中当前记录的位置向前或向后移动特定数量的记录,请调用 Move
。
有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。
CDaoRecordset::MoveLast
调用此成员函数可将记录集中的最后一条记录(如果有)设为当前记录。
void MoveLast();
备注
注意
如果记录集没有记录,则调用任何 Move
函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOF
和 IsEOF
可确定记录集是否包含任何记录。 调用 Open
或 Requery
后,调用 IsBOF
或 IsEOF
。
注意
如果在更新或添加当前记录时调用任何 Move
函数,更新将丢失,而不会发出警告。
使用 Move
函数在不应用条件的情况下从一条记录移到另一条记录。 使用 Find 操作来查找动态集类型或快照类型记录集对象中满足特定条件的记录。 若要在表类型记录集对象中查找记录,请调用 Seek
。
如果记录集引用表类型记录集,则移动操作遵循表的当前索引。 可以使用基础 DAO 对象的 Index 属性设置当前索引。 如果未设置当前索引,则返回的记录的顺序是未定义的。
如果基于 SQL 查询或 querydef 对记录集对象调用 MoveLast
,则查询将被强制完成,并且记录集对象会完全填充。
若要将记录集对象中当前记录的位置向前或向后移动特定数量的记录,请调用 Move
。
有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。
CDaoRecordset::MoveNext
调用此成员函数可将记录集中的下一条记录设为当前记录。
void MoveNext();
注解
建议在尝试移动到上一条记录之前调用 IsBOF
。 调用将 MovePrev
引发 if CDaoException
IsBOF
返回非零值,指示已在第一条记录之前滚动,或者记录集未选择任何记录。
注意
如果记录集没有记录,则调用任何 Move
函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOF
和 IsEOF
可确定记录集是否包含任何记录。 调用 Open
或 Requery
后,调用 IsBOF
或 IsEOF
。
注意
如果在更新或添加当前记录时调用任何 Move
函数,更新将丢失,而不会发出警告。
使用 Move
函数在不应用条件的情况下从一条记录移到另一条记录。 使用 Find 操作来查找动态集类型或快照类型记录集对象中满足特定条件的记录。 若要在表类型记录集对象中查找记录,请调用 Seek
。
如果记录集引用表类型记录集,则移动操作遵循表的当前索引。 可以使用基础 DAO 对象的 Index 属性设置当前索引。 如果未设置当前索引,则返回的记录的顺序是未定义的。
若要将记录集对象中当前记录的位置向前或向后移动特定数量的记录,请调用 Move
。
有关信息,请参阅 DAO 帮助中的主题“Move 方法”和“MoveFirst、MoveLast、MoveNext、MovePrevious 方法”。
CDaoRecordset::MovePrev
调用此成员函数可将记录集中的上一条记录设为当前记录。
void MovePrev();
注解
建议在尝试移动到上一条记录之前调用 IsBOF
。 调用将 MovePrev
引发 if CDaoException
IsBOF
返回非零值,指示已在第一条记录之前滚动,或者记录集未选择任何记录。
注意
如果记录集没有记录,则调用任何 Move
函数将引发异常。 一般情况下,在执行 Move 操作之前调用 IsBOF
和 IsEOF
可确定记录集是否包含任何记录。 调用 Open
或 Requery
后,调用 IsBOF
或 IsEOF
。
注意
如果在更新或添加当前记录时调用任何 Move
函数,更新将丢失,而不会发出警告。
使用 Move
函数在不应用条件的情况下从一条记录移到另一条记录。 使用 Find 操作来查找动态集类型或快照类型记录集对象中满足特定条件的记录。 若要在表类型记录集对象中查找记录,请调用 Seek
。
如果记录集引用表类型记录集,则移动操作遵循表的当前索引。 可以使用基础 DAO 对象的 Index 属性设置当前索引。 如果未设置当前索引,则返回的记录的顺序是未定义的。
不能使用仅向前滚动快照调用 MoveFirst
或 MovePrev
成员函数。
若要将记录集对象中当前记录的位置向前或向后移动特定数量的记录,请调用 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
只允许一致的更新(仅限动态集类型记录集)。
注意
常量 dbConsistent
和 dbInconsistent
是互斥的。 可以在给定的 Open
实例中使用其中的一个,而不能同时使用这两个常量。
pTableDef
指向 CDaoTableDef 对象的指针。 此版本仅对表类型记录集有效。 使用此选项时, CDaoDatabase
不使用用于构造的 CDaoRecordset
指针;而是使用 tabledef 所在的数据库。
pQueryDef
指向 CDaoQueryDef 对象的指针。 此版本仅对动态集类型和快照类型记录集有效。 使用此选项时, CDaoDatabase
不使用用于构造的 CDaoRecordset
指针;而是使用 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_strSort
或 m_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
。 设置新的筛选器或排序依据设置 m_strFilter
,并在 m_strSort
调用 Requery
之前。 通过在调用 Requery
之前将新值分配给参数数据成员来设置新参数。
如果尝试重新生成记录集失败,则会关闭记录集。 在调用 Requery
之前,可以通过调用 CanRestart
成员函数来确定是否可以重新查询记录集。 CanRestart
不保证 Requery
成功。
注意
仅在调用 Open
后调用 Requery
。
注意
调用 Requery
更改 DAO 书签。
如果调用 CanRestart
返回 0,则不能对动态集类型或快照类型记录集调用 Requery
;此外不能对表类型记录集使用它。
如果在调用 Requery
后 IsBOF
和 IsEOF
均返回非零值,则表示查询未返回任何记录,并且记录集不包含任何数据。
有关信息,请参阅 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。 这可以通过将 vtSrc 设置为 VT_BSTRT
<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。 这可以通过将 vtSrc 设置为 VT_BSTRT
<VT_BSTRT
起使用来完成。
有关信息,请参阅 DAO 帮助中的主题“Bookmark 属性”和“Bookmarkable 属性”。
CDaoRecordset::SetCacheSize
调用此成员函数可设置要缓存的记录数。
void SetCacheSize(long lSize);
参数
lSize
指定记录数。 典型值为 100。 设置为 0 会关闭缓存。 该设置必须介于 5 到 1,200 条记录之间。 缓存可能会占用大量内存。
注解
缓存是本地内存中的一个空间,用于保存最近从服务器检索到的数据,以防应用程序运行时再次请求数据。 数据缓存提高了通过动态集类型记录集对象从远程服务器检索数据的应用程序的性能。 请求数据时,Microsoft Jet 数据库引擎首先会在缓存中检查请求的数据,而不是从服务器检索数据,这需要更多时间。 不来自 ODBC 数据源的数据不会保存在缓存中。
任何 ODBC 数据源(例如附加的表)都可以有本地缓存。 若要创建缓存,请从远程数据源打开一个记录集对象,调用 SetCacheSize
和 SetCacheStart
成员函数,然后调用 FillCache
成员函数或使用 Move 操作之一在记录之间移动。 SetCacheSize
成员函数的 lSize 参数可以基于应用程序一次可处理的记录数。 例如,如果将记录集用作屏幕上显示的数据源,则可以将 SetCacheSize
lSize 参数作为 20 传递,一次显示 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。 这可以通过将 vtSrc 设置为 VT_BSTRT
<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 中包含的标志控制此自动字段检查。
对函数的第一个参数使用 NULL 会将该函数应用于所有 outputColumn
字段,而不是 CDaoFieldExchange
中的 param 字段。 例如,调用
SetFieldDirty(NULL);
仅将字段设置为 outputColumn
NULL; 参数字段不受影响。
若要处理 param,必须提供要处理的单个 param 的实际地址,例如:
SetFieldDirty(&m_strParam);
这意味着不能将所有 参数 字段设置为 NULL,就像对 outputColumn
字段一样。
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 。
例如,如果使用双缓冲机制(例如,如果专门希望将当前记录的字段指定为没有值),请将 bNull 设置为 TRUE 进行调用SetFieldNull
,将其标记为 Null。 如果字段之前标记为 Null,并且现在想要为其指定一个值,请设置其新值。 无需使用 SetFieldNull
删除 Null 标记。 若要确定是否允许字段为 Null,请调用 IsFieldNullable。
如果不使用双缓冲机制,则更改字段的值不会自动将字段设置为脏字段和非 Null。 必须专门将字段设置为脏字段且不为 Null。 m_bCheckCacheForDirtyFields 中包含的标志控制此自动字段检查。
DFX 机制采用 PSEUDONULL。 有关详细信息,请参阅 CDaoFieldExchange::m_nOperation。
对函数的第一个参数使用 NULL 会仅将该函数应用于 outputColumn
字段,而不是 CDaoFieldExchange
中的 param 字段。 例如,调用
SetFieldNull(NULL);
仅将字段设置为 outputColumn
NULL; 参数字段不受影响。
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
指向包含字段内容值的字符串的指针。
备注
请使用 SetFieldValue
和 GetFieldValue 在运行时动态绑定字段,而不要使用 DoFieldExchange 机制静态绑定列。
如果不创建 UNICODE 记录集,则必须使用不包含COleVariant
参数的SetFieldValue
窗体,或者COleVariant
必须显式声明对象 ANSI。 这可以通过将 vtSrc 设置为 VT_BSTRT
<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 页。 调用 Update
或 Close
成员函数或者执行任何 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。 这可以通过将 vtSrc 设置为 VT_BSTRT
<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
调用 AddNew
或 Edit
成员函数后调用此成员函数。
virtual void Update();
备注
完成 AddNew
或 Edit
操作需要进行此调用。
AddNew
和 Edit
都准备了一个编辑缓冲区,在其中放置添加或编辑的数据,以便保存到数据源。 Update
保存数据。 仅更新标记为或检测到“已更改”的字段。
如果数据源支持事务,则可以调用 Update
(及其相应的 AddNew
或 Edit
调用)作为事务的一部分。
注意
如果调用 Update
时没有事先调用 AddNew
或 Edit
,则 Update
将引发 CDaoException
。 如果调用 AddNew
或 Edit
,则必须在调用 MoveNext 或者关闭记录集或数据源连接之前调用 Update
。 否则,更改会丢失且没有通知。
当记录集对象在多用户环境中悲观锁定时,从使用 Edit
开始到更新完成的这段时间,记录将保持锁定状态。 如果记录集处于乐观锁定状态,则会锁定该记录,并与在数据库中更新之前预先编辑的记录进行比较。 如果记录在调用 Edit
后已更改,则 Update
操作将会失败,并且 MFC 会引发异常。 可以使用 SetLockingMode
来更改锁定模式。
注意
乐观锁定始终用于外部数据库格式,例如 ODBC 和可安装的 ISAM。
有关信息,请参阅 DAO 帮助中的主题“AddNew 方法”、“CancelUpdate 方法”、“Delete 方法”、“LastModified 属性”、“Update 方法”和“EditMode 属性”。
另请参阅
CObject 类
层次结构图
CDaoTableDef 类
CDaoWorkspace 类
CDaoDatabase 类
CDaoQueryDef 类