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)

异常

Exception

Condition

此方法会抛出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