CRecordset::Open
通过检索表或执行记录集表示的查询打开记录集。
virtual BOOL Open(
UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none
);
参数
nOpenType
接受默认,AFX_DB_USE_DEFAULT_TYPE或者使用从 enum OpenType的下列值之一:使用双向滚动的CRecordset::dynaset 的记录集。成员资格和排序记录确定的,当记录集打开时,但是,其他用户所做的更改到数据值可见执行获取操作。也称为动态集是键集驱动的记录集。
使用双向滚动的CRecordset::snapshot 的静态记录集。因此,在打开时,成员资格和排序记录确定的记录集;,在记录中获取时,数据值确定。其他用户所做的更改不可见,直至记录集关闭并重新打开。
使用双向滚动的CRecordset::dynamic 的记录集。其他用户所做的更改为成员资格,排序和数据值是可见的执行获取操作。请注意许多ODBC驱动程序不支持此类记录集。
使用仅向前滚动的CRecordset::forwardOnly 的只读记录集。
对于 CRecordset,默认值为 CRecordset::snapshot。默认值结构允许Visual C++向导使用ODBC CRecordset 和DAO CDaoRecordset交互,具有不同的默认值。
有关这些记录集类型的更多信息,请参见文章 记录集(odbc)。有关相关信息,请参见文章“使用块和滚动的游标”在 Windows SDK。
警告 如果请求的类型不支持,框架引发异常。
lpszSQL
包含下列操作之一的字符串指针:NULL 指针。
表的名称。
SQL SELECT 语句(可选)与SQL WHERE 或 ORDER BY 子句)。
指定预定义查询(存储过程)的名称 CALL 语句。注意不在大括号和 CALL 关键字之间插入空白。
有关此字符串的更多信息,请参见的表以及有关类向导的角色的讨论的"备注"下。
说明 列的顺序测试的结果的必须与RFX调用的顺序或"批量RFX在您的 DoFieldExchange 或 DoBulkFieldExchange 函数调用重写。
dwOptions
可以指定值的组合的位掩码下面列出。其中一些互相排斥。默认值为 none。CRecordset::none 未设置的选项。此参数值是互斥与其他值。默认情况下,记录集可更新与 编辑 或 删除 并允许追加了 AddNew新记录。可更新性取决于数据源以及在 nOpenType 您指定的选项。批量添加的优化不可用。批量取行不会实现。已删除的记录不会在记录集导航时跳过。书签不可用。自动错误字段检查实现。
CRecordset::appendOnly 不允许 Edit 或 Delete 在记录集。只允许 AddNew。此选项是互斥的 CRecordset::readOnly。
CRecordset::readOnly 打开记录集为只读。此选项是互斥的 CRecordset::appendOnly。
CRecordset::optimizeBulkAdd 使用一个准备的SQL语句优化一次添加多个记录。仅当未使用ODBC API函数 SQLSetPos 更新记录集,适用。第一次更新确定哪些字段标记为已更新。此选项是互斥的 CRecordset::useMultiRowFetch。
CRecordset::useMultiRowFetch 实现批量取行允许多个行检索在单个获取操作。这是旨在的高级功能提高性能;但是,批量记录字段交换不是由类向导支持。此选项是互斥的 CRecordset::optimizeBulkAdd。请注意,如果指定 CRecordset::useMultiRowFetch,然后选项卡 CRecordset::noDirtyFieldCheck 将自动打开(双缓冲不可用);在向前记录集,选项卡 CRecordset::useExtendedFetch 将自动打开。有关批量取行的更多信息,请参见文章 记录集:获取记录(odbc)。
CRecordset::skipDeletedRecords 跳过所有删除的记录,在记录集中定位时常时。这将减慢在某些相对获取的性能。此选项无效在向前记录集。如果您调用了 nRows 参数的 移动 设置为0,因此,CRecordset::skipDeletedRecords 选项设置,Move 将断言。请注意 CRecordset::skipDeletedRecords 类似于 驱动程序包,这意味着,删除的行从记录集中移除。但是,因此,如果您的驱动程序打包记录,则将跳过您删除的那些记录;,当记录集打开时,它不会跳过其他用户删除的记录。CRecordset::skipDeletedRecords 将跳过其他用户删除的行。
CRecordset::useBookmarks 五月使用在记录集书签,因此,如果支持。书签慢的数据检索,但可以提高数据导航的性能。无效在向前记录集。有关更多信息,请参见文章 记录集:书签和绝对位置(odbc)。
CRecordset::noDirtyFieldCheck 关闭自动错误检查字段(双缓冲)。这将提高性能;但是,您必须手动标记字段为"通过调用 SetFieldDirty 和 SetFieldNull 成员函数。监视选件类 CRecordset 的双缓冲类似于选件类 CDaoRecordset的双缓冲。但是,在 CRecordset,则无法启用各字段的双缓冲;您启用的所有字段的或禁用的所有字段。请注意,如果指定选项 CRecordset::useMultiRowFetch,然后 CRecordset::noDirtyFieldCheck 将自动打开,但是,SetFieldDirty 和 SetFieldNull 实现批量取行的记录集无法使用。
CRecordset::executeDirect 不使用一个准备的SQL语句。为了改善性能,因此,如果 Requery 成员函数不会调用中,指定此选项。
而不是 SQLFetch的CRecordset::useExtendedFetch 实现 SQLExtendedFetch。对于实现能在仅向前记录集的批量行模型。如果在仅向前记录集指定选项 CRecordset::useMultiRowFetch,则 CRecordset::useExtendedFetch 将自动打开。
CRecordset::userAllocMultiRowBuffers 用户将数据的存储缓冲区。如果要将自己的存储,请使用 CRecordset::useMultiRowFetch 结合使用此选项;否则,则框架将自动分配必要的存储区。有关更多信息,请参见文章 记录集:获取记录(odbc)。请注意指定 CRecordset::userAllocMultiRowBuffers 的,因此,不指定 CRecordset::useMultiRowFetch 导致生成失败的断言。
返回值
非零,如果成功打开了 CRecordset 对象;否则0,则 CDatabase::Open (如果调用)返回0。
备注
必须调用该成员函数运行记录集定义的查询。在调用 Open之前,必须构造记录集对象。
与数据源的此记录集的连接取决于您在调用 Open之前构造记录集。如果要将传递给未连接到数据源的记录集构造函数的一 CDatabase 对象,此成员函数使用 GetDefaultConnect 尝试打开数据库对象。如果通过 NULL 到记录集构造函数,该构造函数编写您的一 CDatabase 对象和 Open 尝试连接的数据库对象。有关关闭记录集和连接的详细信息。这些更改的情况下,请参见 关闭。
说明 |
---|
到数据源的Access通过 CRecordset 对象始终共享。不同 CDaoRecordset 选件类,不能使用 CRecordset 对象打开与独占访问的数据源。 |
当您调用 Open时,查询,通常 SELECT SQL语句,根据标准来记录显示在下表中。
lpszSQL参数的值 |
确定选定的记录 |
示例 |
---|---|---|
NULL |
GetDefaultSQL返回的字符串。 |
|
SQL表名 |
表中列出的所有列。DoFieldExchange 或 DoBulkFieldExchange的。 |
"Customer" |
预定义查询(存储过程)名称 |
列定义查询返回。 |
"{call OverDueAccts}" |
SELECT 列列表 FROM 表列出 |
从指定的表的指定列。 |
"SELECT CustId, CustName FROM Customer" |
警告 |
---|
注意不在SQL字符串中插入额外的空白。例如,因此,如果在大括号和 CALL 关键字之间插入空格,MFC将会将SQL字符串为表名并将其合并到 SELECT 语句中,将导致引发的异常。同样,因此,如果您的预定义查询使用一个输出参数,而不是在大括号之间插入空白和“?”符号。最后,您不能插入空白在 CALL 语句的大括号前或在 SELECT 语句的 SELECT 关键字之前。 |
通常程序是通过 NULL 到 Open;在这种情况下,Open 调用 GetDefaultSQL。如果使用派生的 CRecordset 选件类,GetDefualtSQL 为您在类向导指定的表名。在 lpszSQL 参数中指定其他信息。
要通过,Open 构造查询的最后一个SQL字符串(该字符串可以包含SQL WHERE,并 ORDER BY 子句追加到 lpszSQL 字符串您传递的)然后执行查询。通过调用 GetSQL 检查该构造的字符串在调用 Open之后。有关记录集如何的其他详细信息构造SQL语句并选择记录,请参见文章 记录集:如何记录集选择记录(odbc)。
您的记录集选件类的字段数据成员绑定到选定数据的列。如果任何记录返回,第一条记录成为当前记录。
如果要将记录集的选项,如筛选器或排序,请指定这些,在构造记录集对象后,但,在调用 Open之前。如果要刷新记录集中的记录,在记录集中已经打开后,请调用 再次查询。
有关更多信息,包括其他示例,请参见位于 记录集(odbc)、 记录集:如何记录集选择记录(odbc)和 记录集:创建和关闭记录集(odbc)。
异常
此方法会引发类型 CDBException* 和 **CMemoryException***的异常。
示例
Open 下面的代码示例演示不同形式调用。
// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived
// objects
// Open rs using the default SQL statement, implement bookmarks, and turn
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
CRecordset::noDirtyFieldCheck);
// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));
// Accept all defaults
rsDefault.Open();
要求
Header: afxdb.h