CRecordset类学习记录
作者:互联网
这里写自定义目录标题
CRecordset类简介
CRecordset对象代表从一个数据源选择的一组记录的集合,被称作“记录集”。CRecordset对象可以以两种形式使用:动态集和快照。动态集是与其它用户的更新保持同步的动态数据集。快照是数据的静态视图。每一种形式都代表打开记录集时固定的一组记录。但是当滚动到动态集中的一个记录时,动态集将反映后来由其它用户或由应用程序中其它记录集对此记录所做的改变。
注意:
如果你正在使用数据访问对象(DAO)类,而不是打开数据库连接(ODBC)类,请使用类CDaoRecordset来代替。
要使用记录集,通常需要从CRecordset派生一个应用程序指定的记录集类。然后记录集从一个数据源中选择记录,就可以:
· 在这些记录中滚动。
· 更新记录并指定一种加锁模式。
· 过滤记录集,以获得那些从数据源中选择出来的可利用的记录。
· 给记录集排序。
· 参数化该记录集以定制它的具有要直到运行时才知道的信息的选项。
要使用你的类,打开一个数据库并构造一个记录集对象,给构造函数传递一个指向你的CDatabase对象的指针。然后调用记录集的Open成员函数,在此你可以指定该对象是一个动态集还是一个快照。调用Open来从数据源中选择数据。在记录集对象被打开之后,用它的成员函数和数据成员来滚动和操作记录。可用的操作根据对象是一个动态集还是一个快照(这依赖于打开数据库连接(ODBC)数据源的性能),是可更新的还是只读的,你是否实现了成组行检取而不同。为了刷新从调用Open以来可能被改变或添加的记录,可以调用对象的Requery成员函数。当你使用完对象之后,调用对象的Close成员函数,并销毁此对象。
在一个派生的CRecordset类中,使用记录字段交换(RFX)或成组记录字段交换(Bulk RFX)来支持读取和更新记录字段。
头文件包含#include <afxdb.h>
快照和动态集的区别
快照(Snapshot)是一种静态视图。当别的用户改变了记录时(包括修改、添加和删除),快照中的记录不受影响,直到调用CRecordset::Requery()函数重新查询记录集。也就是说,快照不反映别的用户对数据源记录的改变。快照的这种静态特性是相对于其他用户而言的,本身用户对记录的修改和删除会正确反映出来,但对于新添加的记录,调用Requery()函数后才能反映到快照中。
动态集是与其它用户的更新保持同步的动态数据集。当别的用户修改或删除了记录时,会在动态集中反映出来。当滚动到修改过的记录时,对其所作的修改会立即反映到动态集中,当记录被删除时,MFC代码会跳过记录集中删除的部分。对于其他用户添加的记录,调用Requery()函数后才能反映到快照中。本身用户对记录的修改、添加和删除会正确反映在动态集中。
快照和动态集有一个共同的特点,那就是在建立记录后,记录集中的成员就已经确定了,因此两种记录集都不能反映别的用户添加的记录。
CRecordset类成员
数据成员
数据成员 | 说明 |
---|---|
m_hstmt | 包含记录集的ODBC语句句柄。类型为HSTMT |
m_nFields | 包含记录集中的字段数据成员数目。类型为UINT |
m_nParams | 包含记录集中参数数据成员的数目。类型为UINT |
m_pDatabase | 包含记录集的ODBC语句句柄。类型为HSTMT |
m_strFilter | 包含一个CString,此对象指定一条结构式查询语言(SQL)的WHERE子句。此成员可用作一个过滤器,只选择符合某一标准的那些记录 |
m_strSort | 包含一个CString,此对象指定一条SQL ORDERBY子句。此成员可用于控制记录的排序 |
构造
函数 | 说明 |
---|---|
CRecordset | 构造一个CRecordset对象。应用程序的派生类必须提供一个调用此函数的构造函数 |
Open | 通过检取记录集表示的表格或执行查询来打开记录集 |
Close | 关闭记录集和与此记录集相关联的ODBC HSTMT |
CRecordset::CRecordset函数声明如下:
CRecordset( CDatabase* pDatabase = NULL );
参数: pDatabase 包含一个执行CDatabase对象的指针,或者是值为NULL。如果不是NULL,并且还没有调用CDatabase对象的Open成员函数来将它连接到数据源上,则记录集试图在它自己的Open调用期间为应用程序打开此CDatabase对象。如果此参数为NULL,则当应用程序利用ClassWizard来派生自己的记录集类时,将使用应用程序所指定的数据源信息来构造并连接一个CDatabase对象。连接字符串由成员函数GetDefaultConnect()提供。
说明:
此成员函数用来构造一个CRecordset对象。应用程序的记录集对象必须是从CRecordset派生的应用程序专用类的对象。可以利用ClassWizard来派生应用程序自己的记录集类。
注意:
应用程序的派生类必须提供它自己的构造函数。在此构造函数中,需要传递适当的参数来调用构造函数CRecordset::CRecordset。
传递NULL参数给你的记录集构造函数,可以为应用程序自动构造并连接一个CDatabase对象。这是一种有用的简捷方式,它不需要应用程序在构造自己的记录集之前构造并连接一个CDatabase对象。
CRecordset::Open函数声明如下:
virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none
);
throw( CDBException, CMemoryException );
返回值:
如果CRecordset对象被成功打开,则返回非零值;否则返回0。
参数:
nOpenType 接收缺省值AFX_DB_USE_DEFAULT_TYPE,或使用下列enumOpenType枚举值之一:
枚举值 | 说明 |
---|---|
CRecordset::dynaset | 可以双向滚动的记录集。当记录集被打开时,记录集的全体成员和记录的顺序都被确定,但是伴随一次获取操作,其它用户对数据值所做的改变是可见的。 |
CRecordset::snapshot | 可以双向滚动的静态记录集。当记录集被打开时,记录集的全体成员和记录的顺序都被确定了;当记录被获取时,其数据值是确定的。其它用户在记录集被关闭,然后再打开之前是不可见的。 |
CRecordset::dynamic | 可以双向滚动的记录集。伴随一次获取操作,其它用户对成员,顺序和数据值所做的改变是可见的。注意,许多ODBC驱动器是不支持这种类型的记录集的。 |
CRecordset::forwardOnly | 只能向前滚动的只读的记录集。 |
对于CRecordset来说,缺省的值是CRecordset::snapshot。这种缺省值机制,允许Visual C++向导与具有不同缺省值的ODBC CRecordset和DAO CDaoRecordset进行交互。
lpszSQL 一个包含下列值之一的字符串指针(一个SQL的SELECT语句,或是一个表名):
字符串 | 说明 |
---|---|
一个NULL指针 | 调用GetDefaultSQL获取缺省的SQL语句 |
一个表名 | 指定将要查询的表名 |
一条SQL SELECT语句 | 可选择带一条SQL WHERE 或ORDER BY子句 |
一条CALL语句 | 指定一个预定义查询(存储过程)名 |
注意:
在你的结果集中,列的顺序必须与在你的重载的DoFieldExchange或DoBulkFieldExchange函数中的RFX和Bulk RFX函数调用的顺序相匹配。
dwOptions 一个bitmask,它可以指定下列值的组合:
值 | 说明 |
---|---|
CRecordset::none | 缺省的,未设置选项。此参数值与所有其它的值是相互独立的。记录集可以用Edit或Delete来更新,并允许用AddNew来添加新记录。这种可更新性依赖于数据源,就像你所指定的nOpenType选项。成组添加的优化没用。成组行检取不会被实现。在记录集中导航时,不能略过被删除的记录。书签没用。实现了自动脏字段检查。 |
CRecordset::appendOnly | 不允许在记录集中进行Edit或Delete。只允许AddNew。此选项与CRecordset::readOnly相互独立。 |
CRecordset::readOnly | 用只读方式打开记录集。此选项与CRecordset::appendOnly相互独立。 |
CRecordset::optimizeBulkAdd | 使用预备的SQL语句来优化一次添加多个记录。只有在你不使用ODBC API函数SQLSetPos来更新记录集时才使用。第一次更新确定将哪一个字段标记为脏的。此选项与CRecordset::useMultiRowFetch相互独立。 |
CRecordset::useMultiRowFetch | 实现成组行检取,允许在一次检取操作中获取多行。这是一个高级特征,是设计来提高性能的;但是,ClassWizard不支持成组记录字段交互。此选项与CRecordset::optimiazBulkAdd相互独立。注意,如果你指定了CRecordset::useMultiRowFetch,则选项CRecordset::noDirtyFieldCheck将自动被返回(双缓冲将无效);对于forwardOnly记录集,选项CRecordset::useExtendedFetch将被自动返回。 |
CRecordset::skipDeletedRecords | 当在记录集中导航时,略过所有已被删除的记录。这将使某个相关获取的性能下降。在一个forwardOnly的记录集中,此选项是无效的。 |
CRecordset::useBookarks | 允许在记录集中使用书签,如果支持书签的话。书签会使数据检取变慢,但是会提高数据导航的性能。在forwardOnly的记录集中此选项是无效的。 |
CRecordset::noDirtyFieldCheck | 关闭自动脏数据检查(双缓冲)。这将提高性能;但是,你必须通过调用SetFieldDirty和SetFieldNull成员函数来手动标记变脏的字段。注意,如果你指定了选项CRecordset::useMultiRowFetch,则CRecordset::noDirtyFieldCheck将被自动返回;但是,SetFieldDirty和SetFieldNull不能在实现成组行检取的记录集中使用。 |
CRecordset::executeDirect | 不要使用预备的SQL语句。如果永远不会调用Requery成员函数,则指定此选项来提高性能。 |
CRecordset::useExtendedFetch | 实现SQLException来代替SQLFetch。这是设计来在forwardOnly的记录集中实现成组行检取的。如果你在一个forwardOnly的记录集中指定了选项CRecordset::userMultiRowFetch,则CRecordset::useExtendedFetch将被自动返回。 |
CRecordset::userAllocMultiRowBuffers | 用户将为数据分配存储缓存。如果你想分配自己的存储区,将此选项与CRecordset::useMultiRowFetch连接;否则,框架将自动分配必要的存储区。注意,指定了CRecordset::userAllocMutiRowBuffers,而没有指定CRecordset::useMultiRowFetch,将导致一个错误。 |
CRecordset::Close函数声明如下:
virual void Close();
说明:
此成员函数用来关闭记录集。ODBC HSTMT和框架分配给这个记录集的内存都将被释放。通常在调用Close之后,如果此C++记录集对象是用new分配的,则由应用程序来负责删除它。
在调用Close之后,应用程序可再次调用Open函数。这使应用程序可复用此对象。另一方式是调用Requery。
记录集属性
属性 | 说明 |
---|---|
CanAppend | 如果新记录可以通过 AddNew 成员函数增加到记录集中,则该函数返回一个非零值 |
CanBookmark | 如果记录集支持书签则函数返回一个非零值 |
CanRestart | 如果可以调用Requery来再次运行记录集的查询,则该函数返回一个非零值 |
CanScroll | 如果应用程序可以滚动记录,则该函数返回一个非零值 |
CanTransact | 如果数据源支持事务,则该函数返回一个非零值 |
CanUpdate | 如果记录集可修改(应用程序可以增加、修改或删除记录),则该函数返回一个非零值 |
GetODBCFieldCount | 返回记录集中的字段数目 |
GetRecordCount | 返回记录集中的记录数目 |
GetStatus | 获取记录集的状态:读取记录的索引,以及是否已获取到记录的最终计数 |
GetTableName | 获取此记录集基于的表的名字 |
GetSQL | 获取用于选择记录集的记录的SQL字符串 |
IsOpen | 如果前面已经调用了Open函数,则此函数返回一个非零值 |
IsBOF | 如果记录集已经定位在第一个记录前,则此函数返回一个非零值 |
IsEOF | 如果记录集已经定位在最后一个记录后,则此函数返回一个非零值 |
IsDeleted | 如果记录集定位在一个已删除的记录上,则该函数返回一个非零值 |
记录集更新操作
操作 | 说明 |
---|---|
AddNew | 为增加新记录作准备。调用Update来完成增加 |
CancelUpdate | 取消任何用AddNew或Edit操作指定的未决定的更新 |
Delete | 从记录集中删除当前记录。删除之后,应用程序必须显式地滚动到另一个记录 |
Edit | 为改变当前记录作准备。调用Update来完成编辑 |
Update | 通过将新数据或所编辑的数据保存到数据源上,来完成一次AddNew或Edit操作 |
记录集定位操作
操作 | 说明 |
---|---|
GetBookMark | 将一个记录的标签值分配给该参数对象 |
Move | 将记录集双向定位到距离当前记录指定数目的记录的位置 |
MoveFirst | 定位当前记录为记录集中的第一个记录。该函数应首先测试IsBOF |
MoveLast | 定位当前记录为记录集中的最后一个记录。该函数应首先测试IsEOF |
MoveNext | 定位当前记录为记录集中的下一个记录。该函数应首先测试IsEOF |
MovePrev | 定位当前记录为记录集中的第一个记录。该函数应首先测试IsBOF |
SetAbsolutePosition | 将记录集定位到与指定的记录数相对应的位置 |
SetBookmark | 定位记录集到书签指定的位置 |
其他记录集操作
操作 | 说明 |
---|---|
Cancel | 取消一次异步操作或一次来自第二线程的处理 |
FlushResultSet | 当使用一个预定义的查询时,如果有另外一个结果被获取,返回非零值 |
GetFieldValue | 返回记录集中的一个字段的值 |
GetODBCFieldInfo | 返回记录集中各字段的指定类别的信息 |
GetRowsetSize | 返回在一次单个获取中你要获取的记录数目 |
GetRowsFetched | 返回在一次获取中实际获取的行数 |
GetRowStatus | 返回在一次获取中行的状态 |
IsFieldDirty | 如果在当前记录中的指定字段被改变,则返回一个非零值 |
IsFieldNull | 如果当前记录中的指定字段是Null(没有值),则返回非零值 |
IsFieldNullable | 如果当前记录中的指定字段可被设置为Null(没有值),则返回非零值 |
RefreshRowset | 刷新指定行的数据和状态 |
Requery | 再次运行记录集的查询来刷新所选择的记录 |
SetFieldDirty | 标记当前记录中的指定字段是被改变的 |
SetFieldNull | 设置当前记录中的指定字段的值为Null(没有值) |
SetLockingMode | 将加锁模式设置为“乐观”加锁(缺省值)或“悲观”加锁。确定任何更新加锁记录 |
SetParamNull | 将指定的参数设置为Null(没有值) |
SetRowsetCursorPosition | 将游标定位在记录集中的指定行上 |
记录集重载函数
函数 | 说明 |
---|---|
Check | 用来检查从一个ODBC API函数返回的代码 |
CheckRowSetError | 用来处理在获取记录期间产生的错误 |
DoBulkFieldExchange | 用来将一组数据行从数据源中交换到记录集中。实现成组记录交换(Bulk RFX) |
DoFieldExchange | 用来在此记录集的字段数据成员和数据源上对应的记录之间交换数据(双向)。双向记录字段交换(RFX) |
GetDefaultConnect | 用来获取缺省的字符串 |
GetDefaultSQL | 用来获取要执行的缺省的SQL字符串 |
OnSetOptions | 用来为指定的ODBC语句设置选项 |
SetRowsetSize | 指定在一次获取中你希望获取的记录数目 |
标签:调用,函数,记录,记录集,指定,学习,CRecordset 来源: https://blog.csdn.net/qq_44549547/article/details/115689904