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 WHEREORDER BY 子句)。

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

    有关此字符串的更多信息,请参见的表以及有关类向导的角色的讨论的"备注"下。

    备注

    列的顺序测试的结果的必须与RFX调用的顺序或"批量RFX在您的 DoFieldExchangeDoBulkFieldExchange 函数调用重写。

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

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

    • CRecordset::appendOnly 不允许 EditDelete 在记录集。 只允许 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 关闭自动错误检查字段(双缓冲)。 这将提高性能;但是,您必须手动标记字段为"通过调用 SetFieldDirtySetFieldNull 成员函数。监视选件类 CRecordset 的双缓冲类似于选件类 CDaoRecordset的双缓冲。 但是,在 CRecordset,则无法启用各字段的双缓冲;您启用的所有字段的或禁用的所有字段。 请注意,如果指定选项 CRecordset::useMultiRowFetch,然后 CRecordset::noDirtyFieldCheck 将自动打开,但是,SetFieldDirtySetFieldNull 实现批量取行的记录集无法使用。

    • CRecordset::executeDirect 不使用一个准备的SQL语句。 为了改善性能,因此,如果 Requery 成员函数不会调用中,指定此选项。

    • 而不是 SQLFetchCRecordset::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表名

表中列出的所有列。DoFieldExchangeDoBulkFieldExchange的。

"Customer"

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

列定义查询返回。

"{call OverDueAccts}"

SELECT 列列表 FROM 表列出

从指定的表的指定列。

"SELECT CustId, CustName FROM

Customer"

警告

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

通常程序是通过 NULLOpen;在这种情况下,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

请参见

参考

CRecordset选件类

层次结构图

CRecordset::CRecordset

CRecordset::Close

CRecordset::GetDefaultSQL

CRecordset::GetSQL

CRecordset::m_strFilter

CRecordset::m_strSort

CRecordset::Requery