CDaoRecordset::Open

virtual void Open(int nOpenType = AFX_DAO_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, int nOptions=0);
  throw(CDaoException, CMemoryException);
virtual void Open(CDaoTableDef* pTableDef, int nOpenType = dbOpenTable, int nOptions=0);
  throw(CDaoException, CMemoryException);
virtual void Open(CDaoQueryDef* pQueryDef, int nOpenType = dbOpenDynaset, int nOptions=0);
  throw(CDaoException, CMemoryException);

参数:
nOpenType下列值之一:
·dbOpenDynaset具有双向滚动的动态集型记录集。这是缺省值。
·dbOpenTable具有双向滚动的表型记录集。
·dbOpenSnapshot具有双向滚动的快照型记录集。
lpszSQL包含下列之一的一个字符串指针:
·NULL指针
·一个或多个表定义和/或查询定义(用逗号分隔)的名字。
·一条SQL SELECT语句(任选SQL WHERE或ORDER BY子句)。
·一个遍历查询
nOptions下面列出的一个或多个选项,缺省值为0,可能值如下:
·dbAppendOnly只能附加新记录(仅对动态集型记录集)。这个选项的字面含意是只能附加记录。MFC ODBC数据库类有一个只附加选项,允许获取和附加记录。
·dbForwardOnly记录集是只能向前滚动的快照。
·dbSeeChanges如果其它用户正在修改你在编辑的数据,产生一个异常。
·dbDenyWrite其它用户不能修改或添加记录。
·dbDenyRead其它用户不能查找记录(仅对表型记录集)。
·dbReadOnly只能查找记录,其它用户可以修改它们。
·dbInconsistent允许不一致更新(仅对动态集型记录集)。
·dbConsistent只允许一致更新(仅对动态集型记录集)。
注意:常量dbConsistent和dbInconsistent相互排斥。可以使用任何一个,但不能在Open的给定实例中使用两个。
pTableDef指向CDaoTableDef对象的一个指针。这个版本只对表型记录集有效。使用这个选项时,不使用用于构造CDaoRecordset的CDaoDatabase指针,而使用表定义所在的数据库。
pQueryDef指向CDaoQueryDef对象的一个指针。这个版本只对动态集型和快照型记录集有效。使用这个选项时,不使用用于构造CDaoRecordset的CDaoDatabase指针,而使用查询定义所在的数据库。

说明:
必须调用这个成员函数来获取记录集记录。调用Open之前必须构造记录集对象。
这里有几种方法实现此点:
·构造记录集对象时,向已经打开的CDaoDatabase对象传递一个指针。
·构造记录集对象时,向未打开的CDaoDatabase对象传递一个指针。记录集打开CDaoDatabase对象,但在记录集对象关闭时并不关闭它。
·构造记录集对象时,传递一个NULL指针。记录集对象调用GetDefaultDBName获取要打开的Microsoft Access .MDB文件名。然后记录集打开CDaoDatabase对象并在记录集打开期间保持它打开。在记录集上调用Close时,CDaoDatabase对象也将关闭。
注意:
记录集打开CDaoDatabase对象时,它以非独占访问方式打开数据源。
对使用lpszSQL参数的Open版本,一旦打开记录集,可以以几种方式之一获取记录。第一个选项是在DoFieldExchange中有DFX函数。第二个选项是通过调用GetFieldValue成员函数使用动态绑定。这些选项可以分别实现或联合实现。如果联合,必须传递Open调用上自己的SQL语句。有关动态绑定的更多信息,请参阅联机文档“Visual C++程序员指南”中的“DAO记录集:动态绑定记录”。
在使用Open的第二个版本时,要传递给CDaoTableDef对象,所得列可以让你用于通过DoFieldExchange和DFX机制绑定和/或通过GetFieldValue动态绑定。
注意:只能对表型记录集用CDaoTableDef调用Open。
在使用Open的第三个版本时,要传递给CDaoQueryDef对象,将执行查询,所得列可以让你通过DoFieldExchange和DFX机制绑定和/或通过GetFieldValue动态绑定。
注意:
只能对动态集型和快照型记录集用CDaoQueryDef调用Open。
对使用lpszSQL参数的第一个Open版本,基于下表中所列条件选择记录:
LpszSQL参数值确定的选择记录条件实例
NULLGetDefaultSQL返回的字符串 
一个或多个表定义和/或查询定义名字的用逗号分隔的列DoFieldExchange表示的所有列"Customer"
SELECT列列表FROM表列表来自指定表定义和/或查询定义的指定列"SELECT CustID,CustName FROMCustomer"
通常过程是向Open传递NULL;这时Open调用GetDefaultSQL,它是创建CDaoRecordset派生类时ClassWizard生成的覆盖成员函数。它的值给出你在ClassWizard中定义的表定义和/或列定义名字。可以替换指定lpszSQL参数中的其它信息。
不论传递何值,Open为查询创建最终SQL字符串(字符串必须有SQLWHERE和ORDER BY子句附加在传递的lqszSQL字符中后面),然后执行这个查询。在调用Open后,通过调用GetSQL可以检查构造的字符串。
记录集类的字段数据成员受选择数据列的绑定。如果返回任何记录,第一条记录成为当前记录。
如果想为记录集设置选项,例如过滤器或者排序,要在构造记录集对象之后和调用Open之前设置m_strSORT或m_strFilter。如果打开记录集后想更新记录集中的记录,要调用Requery。
如果在动态集型或快照型记录集上调用Open,或者数据源参考表示附加表的SQL语句或表定义,则不能为这种参数使用dbOpenType;如果这样做,MFC会产生一个异常。为确定表定义对象是否表示一个附加列,要创建CDaoTableDef对象并调用它的GetConnect成员函数。
在编辑删除相同记录时,如果想跟踪其它用户或者机器上另一个程序所做的变化,使用dbSeeChanges标记。例如两个用户开始编辑同一条记录,第一个用户调用Update成员函数成功。第二个用户调用Update时产生CDaoException。类似地,如果第二个用户想调用Delete删除这条记录,而它已经由第一个用户改变了,则产生CDaoException。
典型地,如果用户在更新时得到这个CDaoException,代码应该更新字段内容并获取最近更新值。如果在删除过程中出现异常,代码能够向用户显示新记录数据和表示数据近期被改变的消息。在这一点,代码能够请求确认用户是否仍然想删除此记录。
提示:
在应用对由ODBC数据源打开的记录集遍历时,使用只能前滚选项(dbForwardOnly)来改善性能。
有关打开记录集的更多信息,请参阅联机文档“Visual C++程序员指南”中的“DAO记录集:创建记录集”。有关信息,请参阅DAO帮助中的“OpenRecordset方法”。

请参阅:CDaoRecordset::Close, CDaoRecordset::CDaoRecordset