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::dynaset 双向滚动的的记录集。 根据获取操作,其他用户所做的对于成员资格,排序和数据值的更改是可见的。 请注意许多 ODBC 驱动程序不支持此类记录集。

    • CRecordset::forwardOnly 仅向前滚动的的只读记录集。

      对于 CRecordset,默认值为 CRecordset::snapshot。 默认值机制允许 Visual C++ 向导与ODBC CRecordset 和 DAO CDaoRecordset交互,这时具有不同的默认值。

    有关这些记录集类型的详细信息,请参见文章记录集 (odbc)。 有关相关信息,请参见Windows SDK中的文章“使用块和可滚动光标”。

    警告

    如果不支持请求的类型,框架抛出异常。

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

    • 一个NULL 指针。

    • 表的名称。

    • SQL的SELECT 语句(WHEREORDER BY 子句是可选的)

    • CALL 语句指定预定义查询 (存储过程) 的名称 。 注意不要在大括号和 CALL 关键字之间插入空格。

    有关此字符串的详细信息,请参见备注下的表格和类向导的角色的讨论。

    备注

    结果集的列排序必须与DoFieldExchangeDoBulkFieldExchange 重写函数的RFX或批量 RFX功能调用的顺序相对应 。

  • dwOptions
    可以指定下列值的组合的位掩码。 其中一些是互相排斥。 默认值为 none

    • CRecordset::none 无选项设置。 此参数值与其他值相互排斥。 默认情况下,记录集可随编辑删除操作更新,通过AddNew操作允许追加新记录。 可更新性取决于数据源,也可以是指定的nOpenType选项 。 批量添加的优化不可用。 无法完成批量取行。 在记录集导航时,不会跳过已删除的记录。 书签不可用。 已实现自动错误字段检查。

    • CRecordset::appendOnly 不允许在记录集上进行编辑删除。 只允许 AddNew。 此选项与CRecordset::readOnly互斥 。

    • CRecordset::readOnly 打开记录集为只读。 此选项与CRecordset::appendOnly互斥 。

    • CRecordset::optimizeBulkAdd 使用一个准备好的 SQL 语句来优化一次添加多个记录操作。 当不使用 ODBC API 函数 SQLSetPos 来更新记录集才适用。 第一次更新确定哪些字段标记为错误。 此选项与 CRecordset::useMultiRowFetch 互相排斥。

    • CRecordset::useMultiRowFetch 在单个获取操作中,实现批量取行来允许多个行检索操作。 这是一个旨在提高性能的高级功能;但是,批量记录字段交换不被类向导支持。 此选项与CRecordset::appendOnly互斥 。 请注意,如果指定 CRecordset::useMultiRowFetch,然后选项 CRecordset::noDirtyFieldCheck 将自动打开 (双缓冲区域技术不可用);在向前记录集,选项 CRecordset::useExtendedFetch 将自动打开。 有关批量取行的更多信息,请参见文章记录集:批量获取记录 (ODBC)

    • CRecordset::skipDeletedRecords  在浏览记录集时,跳过所有删除的记录。 进行某些相关获取时,性能将减慢。 此选项在向前记录集中无效。 如果您调用了移动并将参数nRows设置为 0,CRecordset::skipDeletedRecords 选项设置,移动 将进行断言操作。 请注意 CRecordset::skipDeletedRecords 类似于 驱动程序包,这意味着,删除的行已从记录集中移除。 但是,如果您的驱动程序包有记录,则将跳过您删除的那些记录;当记录集打开时,它不会跳过其他用户删除的记录。 CRecordset::skipDeletedRecords 将跳过其他用户删除的行。

    • CRecordset::useBookmarks如果支持, 可能使用记录集中的书签,。 书签减慢数据检索的速度,但可以提高数据导航的性能。 在向前记录集中无效。 有关更多信息,请参见文章记录集:书签和绝对位置 (ODBC)

    • CRecordset::noDirtyFieldCheck 关闭自动错误检查字段 (双缓冲区域技术)。 这将提高性能;但是,您必须通过调用 SetFieldDirtySetFieldNull 成员函数来手动标记错误字段。注意到 CRecordset 的双缓冲技术类似于 CDaoRecordset的双缓冲技术。 但是,在 CRecordset中,则无法启用单独字段的双缓冲区技术;您可以为所有字段启用或禁用双缓冲技术。 请注意,如果指定选项 CRecordset::useMultiRowFetch,然后 CRecordset::noDirtyFieldCheck 将自动打开,但是,SetFieldDirtySetFieldNull 无法在实现批量取行的记录集上使用。

    • CRecordset::executeDirect 不使用一个准备好的 SQL 语句。 为了改善性能,在再次查询 成员函数不会被调用时,指定此选项。

    • CRecordset::useExtendedFetch 实现 SQLExtendedFetch而非SQLFetch。 为在仅向前的记录集中实现批量行获取而设计。 如果在仅向前记录集中指定选项 CRecordset::useMultiRowFetch,则 CRecordset::useExtendedFetch 将自动打开。

    • CRecordset::userAllocMultiRowBuffers 用户将分配数据的存储缓冲区。 如果要分配自己的存储,请CRecordset::useMultiRowFetch中使用此选项;否则,则框架将自动分配必要的存储区。 有关更多信息,请参见文章记录集:批量获取记录 (ODBC)。 请注意指定 CRecordset::userAllocMultiRowBuffers,而不指定 CRecordset::useMultiRowFetch 将导致断言的失败。

返回值

如果成功打开了 CRecordset 对象,返回非零;CDatabase::Open(如果调用)返回 0。

备注

必须调用该成员函数运行记录集定义的查询。 在调用 打开之前,必须构造记录集对象。

此记录集的与数据源的连接取决于如何在调用 打开之前构造记录集。 如果要传递CDatabase 对象给未连接到数据源的记录集构造函数的,此成员函数须使用 GetDefaultConnect 尝试打开数据库对象。 如果传递NULL 到记录集构造函数,该构造函数为你构造CDatabase 对象, 打开函数 尝试连接到数据库对象。 有关关闭记录集和不同情况下连接的详细信息,请参见 关闭

备注

通过CRecordset 对象访问数据源始终是共享的。不同于 CDaoRecordset 类,不能使用 CRecordset 对象打开与独占访问的数据源。

当您调用 打开时,查询,通常是SELECTSQL语句,根据下表的标准来选择记录。

lpszSQL 参数的值。

选定的记录确定于:

示例

NULL

GetDefaultSQL返回的字符串。

 

SQL表名称

DoFieldExchangeDoBulkFieldExchange列表中的所有列。。

"Customer"

预定义查询 (存储过程) 名称

查询定义返回的列。

"{call OverDueAccts}"

SELECT 列表列 FROM 列表列

从指定的表中指定列。

"SELECT CustId, CustName FROM

Customer"

警告

注意不要在 SQL 字符串中插入额外的空白。例如,如果在大括号和 CALL 关键字之间插入空格,MFC 会将 SQL 字符串作为表名并将其合并到 SELECT 语句中,这将抛出异常。同样,如果您的预定义查询使用一个输出参数,不要在大括号和“?”符号之间插入空白。最后,您不能在 CALL 语句的大括号前或在 SELECT 语句的 SELECT 关键字之前插入空白。

通常的过程是传递NULL打开;在这种情况下,打开 调用 GetDefaultSQL。 如果使用派生的 CRecordset 类,GetDefaultSQL 给出在类向导中指定的表名。 在 lpszSQL 参数中指定其他信息。

无论传递什么,打开 构造查询的最后一个 SQL 字符串 (该字符串可以包含 SQLWHEREORDER BY子句追加到您传递的lpszSQL 字符串), 然后执行查询。 在调用 打开之后,通过调用 GetSQL 检查该构造的字符串。 有关记录集如何构造 SQL 语句并选择记录的其他详细信息,请参见文章 记录集:记录集如何选择记录 (ODBC)

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

如果想要为记录集设置选项,如筛选器或排序,请在构造记录集对象后指定这些,而非在调用 打开之前。 如果要在记录集中打开后刷新记录集中的记录,请调用 再次查询

有关更多信息,包括其他示例,请参见文章记录集 (ODBC)记录集:如何记录集选择记录 (ODBC)记录集:创建和关闭记录集 (ODBC)

异常

此方法会抛出CDBException* 和 **CMemoryException***的类型异常。

示例

下面的代码示例演示不同形式的打开的调用。

// 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();

要求

标头: afxdb.h

请参见

参考

CRecordset Class

层次结构图

CRecordset::CRecordset

CRecordset::Close

CRecordset::GetDefaultSQL

CRecordset::GetSQL

CRecordset::m_strFilter

CRecordset::m_strSort

CRecordset::Requery