virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none
);
throw( CDBException, CMemoryException );
返回值:
如果CRecordset对象被成功打开,则返回非零值;否则,如果CDatabase::Open(如果被调用了)返回0,则返回0。
参数:
说明:
你必须调用此成员函数来运行记录集定义的查询。在调用Open之前,你必须构造记录集对象。
此记录集与数据源的连接依赖于在调用Open之前你是如何构造这个记录集的。如果你将一个没有连接到一个数据源的CDatabase对象传递给记录集构造函数,此成员函数使用GetDefaultConnect来尝试打开该数据库对象。如果你将NULL传递给记录集构造函数,则此成员函数为你构造一个CDatabase对象,并且Open试图连接给数据库对象。有关关闭记录集和在这些不同的环境下的连接的细节,请参见Close。
注意:
通过一个CRecordset对象对数据源的访问总是被共享的。不像CDaoRecordset类,不能使用一个CRecordset对象来打开一个具有独占访问的数据源。
当你调用Open时,一条查询语句,通常是一条SQL SELECT语句,基于下表给出的标准来选择记录:
警告:
注意,在SQL字符串中,你不能插入额外的空格。例如,如果你在卷括号和CALL关键字之间插入了空格,MFC将错误地将这个SQL串解释为一个表名,并将它合并到SELECT语句中,这将导致抛出一个异常。
类似地,如果使用输出参数的预定义查询没有在卷括号和‘?’号之间插入空格,则也会导致抛出异常。最后,你不能在一个CALL语句中的卷括号之前和在一个SELECT语句中的SELECT关键字之前插入空格。
通常的程序是将NULL传递给Open;在这种情况下,Open调用GetDefaultSQL。如果你正在使用一个CRecordset派生类,GetDefaultSQL给出你在ClassWizard中指定的表名。你可以代替在lpszSQL参数中指定其它的信息。
不管传递的是什么,Open都为查询构造一个最后的SQL字符串(该字符串可能有SQL WHERE和ORDER BY子串添加在你传递的lpszSQL串中),然后执行这个查询。你可以在调用Open之后通过调用GetSQL来检查这个构造出来的字符串。
记录集类的字段数据成员与所选择数据的列相关联。如果有记录被返回,则第一个记录成为当前记录。
如果你想为记录集设置选项,比如一个过滤器或排序,则应在构造了此记录集对象之后,但在调用Open之前指定这些选项。如果你要在记录集被打开之后刷新记录集中的记录,可以调用Requery。
示例:
下面的代码例子说明了Open调用的不同形式。
// rs 是一个CRecordset或CRecordset派生对象
// 用缺省的SQL语句打开rs
// 实现书签,并关闭自动脏数据检查
rs.Open( CRecordset::snapshot, NULL, CRecordset::useBookmarks | CRecordset::noDirtyFieldCheck );
// 传递一个完整的SELECT语句并打开作为一个动态集
rs.Open( CRecordset::dynaset, _T( "Select L_Name from Customer" ) );
// 接收所有的缺省值
rs.Open( );
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none
);
throw( CDBException, CMemoryException );
返回值:
如果CRecordset对象被成功打开,则返回非零值;否则,如果CDatabase::Open(如果被调用了)返回0,则返回0。
参数:
nOpenType | 接收缺省值AFX_DB_USE_DEFAULT_TYPE,或使用下列enumOpenType枚举值之一:
与此有关的信息,参见“ODBC SDK程序员参考”中文章的“使用块和可滚动游标”。 警告:如果不支持要求的类型,框架将抛出一个异常。 | |||||||||||||||||||||||||||||||||
lpszSQL | 一个包含下列值之一的字符串指针:
注意: 在你的结果集中,列的顺序必须与在你的重载的DoFieldExchange或DoBulkFieldExchange函数中的RFX和Bulk RFX函数调用的顺序相匹配。 | |||||||||||||||||||||||||||||||||
dwOptions | 一个bitmask,它可以指定下列值的组合。这些值中的某些是相互独立的。缺省的值是none。
|
说明:
你必须调用此成员函数来运行记录集定义的查询。在调用Open之前,你必须构造记录集对象。
此记录集与数据源的连接依赖于在调用Open之前你是如何构造这个记录集的。如果你将一个没有连接到一个数据源的CDatabase对象传递给记录集构造函数,此成员函数使用GetDefaultConnect来尝试打开该数据库对象。如果你将NULL传递给记录集构造函数,则此成员函数为你构造一个CDatabase对象,并且Open试图连接给数据库对象。有关关闭记录集和在这些不同的环境下的连接的细节,请参见Close。
注意:
通过一个CRecordset对象对数据源的访问总是被共享的。不像CDaoRecordset类,不能使用一个CRecordset对象来打开一个具有独占访问的数据源。
当你调用Open时,一条查询语句,通常是一条SQL SELECT语句,基于下表给出的标准来选择记录:
lpszSQL参数的值 | 选择的记录所决定于 | 示例 |
NULL | 由GetDefaultSQL返回的字符串 | |
SQL表名 | 在DoFieldExchange或DoBulkFieldExchange中的列表的所有列 | "Customer" |
预定义的查询(存储过程)名称 | 该查询被定义的要返回的列 | "{callOverDueAccts}" |
SELECT 列表 FROM 列表 | 从指定的表中选出的指定的列 | "SELECT CustId, CustName FROM Customer" |
注意,在SQL字符串中,你不能插入额外的空格。例如,如果你在卷括号和CALL关键字之间插入了空格,MFC将错误地将这个SQL串解释为一个表名,并将它合并到SELECT语句中,这将导致抛出一个异常。
类似地,如果使用输出参数的预定义查询没有在卷括号和‘?’号之间插入空格,则也会导致抛出异常。最后,你不能在一个CALL语句中的卷括号之前和在一个SELECT语句中的SELECT关键字之前插入空格。
通常的程序是将NULL传递给Open;在这种情况下,Open调用GetDefaultSQL。如果你正在使用一个CRecordset派生类,GetDefaultSQL给出你在ClassWizard中指定的表名。你可以代替在lpszSQL参数中指定其它的信息。
不管传递的是什么,Open都为查询构造一个最后的SQL字符串(该字符串可能有SQL WHERE和ORDER BY子串添加在你传递的lpszSQL串中),然后执行这个查询。你可以在调用Open之后通过调用GetSQL来检查这个构造出来的字符串。
记录集类的字段数据成员与所选择数据的列相关联。如果有记录被返回,则第一个记录成为当前记录。
如果你想为记录集设置选项,比如一个过滤器或排序,则应在构造了此记录集对象之后,但在调用Open之前指定这些选项。如果你要在记录集被打开之后刷新记录集中的记录,可以调用Requery。
示例:
下面的代码例子说明了Open调用的不同形式。
// rs 是一个CRecordset或CRecordset派生对象
// 用缺省的SQL语句打开rs
// 实现书签,并关闭自动脏数据检查
rs.Open( CRecordset::snapshot, NULL, CRecordset::useBookmarks | CRecordset::noDirtyFieldCheck );
// 传递一个完整的SELECT语句并打开作为一个动态集
rs.Open( CRecordset::dynaset, _T( "Select L_Name from Customer" ) );
// 接收所有的缺省值
rs.Open( );
请参阅
转自:http://wangsf150.blog.163.com/blog/static/50149575201236104410890/