MFC ODBC 连接sql server

1.do not call CDaoDatabase::Open after CDaoDatabase::Create

2.在线程中操作数据库会有各种各样的问题,最好通过发送消息来解决此问题。

3.初始化

CDaoDatabase* m_pobjDaoDb;
  CDaoTableDef* m_pobjDaoTd;
  CDaoRecordset* m_pobjDaoRs;
  CDaoFieldInfo* m_pobjDaoFI;
  CDaoQueryDef* m_pobjDaoQd;

 m_pobjDaoDb = new CDaoDatabase;
 m_pobjDaoTd = new CDaoTableDef(m_pobjDaoDb);
 m_pobjDaoRs = new CDaoRecordset(m_pobjDaoDb);
 m_pobjDaoFI = new CDaoFieldInfo;
 m_pobjDaoQd = new CDaoQueryDef(m_pobjDaoDb);

注意,传给m_pobjDaoTd的是CDaoDatabase指针,而不是CDaoQueryDef指针,后面要用到CDaoQueryDef指针时,必须先把m_pobjDaoTd close掉,再传进CDaoQueryDef指针。

4.查询

(1) m_pobjDaoQd->Create(NULL, _T("SELECT COUNT(*) FROM [FileInfo] GROUP BY [FileInfo].[HashValue]"));
 m_pobjDaoRs->Close();
 m_pobjDaoRs->Open(m_pobjDaoQd);

 while (!m_pobjDaoRs->IsEOF())
 {
  m_pobjDaoRs->GetFieldValue(0, olevarField);
  lFileNum = V_I4(&olevarField);
  m_pobjDaoRs->MoveNext();
 }
 m_pobjDaoRs->Close();

注意:本次查询结果想得到整形值,所以用V_I4转换。

(2)m_pobjDaoQd->Create(NULL, _T("SELECT * FROM [FileInfo]"));

m_pobjDaoRs->Close();
 m_pobjDaoRs->Open(m_pobjDaoQd);

while (!m_pobjDaoRs->IsEOF())
 {
  m_pobjDaoRs->GetFieldValue(0, olevarField);
   strhashVal = (LPCSTR)olevarField.bstrVal;
  m_pobjDaoRs->MoveNext();
 }

注意:本次查询结果想得到CString类型的值,所以用LPCSTR)olevarField.bstrVal把COleVariant olevarField;转换为CString类型。

5.多线程

 

CDaoDatabase不能使用于多线程。为此,本文做了以下几个试验。

① 在主对话框中建立CDaoDatabase对象,然后把该对象传入到扫描线程中。

这样做的结果是,凡是涉及到数据库操作的语句,如创建,查询等,在运行时都会出错。很明显,这是因为CDaoDatabase对象跨越了主对话框线程和扫描工作线程。

② 在线程中建立CDaoDatabase对象,一切的数据库操作都在单个独立的线程中完成。

这样做的结果是在线程中的所有数据库操作都能正常运行,但是当关闭主对话框时,发生运行错误。

这个错误比较隐蔽。究其原因如下,对于MFC工程,当在工作线程中新建CDaoDatabase对象时,主线程(主对话框线程)会纪录这个对象的指针,即使工作线程结束后,这个对象被释放,在主线程中的CDaoDatabase对象指针仍没有被真正释放,直到主对话框结束时,MFC会对数据库对象做一些注销的扫尾工作。这也就很隐蔽的使工作线程中声明的CDaoDatabase对象跨线程了。

③ 在主对话框线程中建立CDaoDatabase对象,且不传入工作线程中,每当工作线程中要读写数据库时,就向主对话框发消息,让主对话框中的消息响应函数操作数据库。

   这样做,程序不会崩溃,但是,由于硬盘中有大量的文件,向数据库中的读写操作非常多,GUI对话框主线程由于处理了太多的消息而使得主界面很长时间无法响应,这是一个GUI程序不能允许的,因此,此方法也行不通。

在主对话框中建立一个隐藏窗口,在该隐藏窗口中建立CDaoDatabase对象,由该隐藏窗口接受工作线程的消息,操作数据库。

这样就圆满的解决了上述问题。当然,由于隐藏窗口是在主对话框进程内创建的,MFC的消息流动机制会使得隐藏窗口处理消息时也会对主对话框的响应产生一定影响,这时,我们只用在每次向隐藏窗口发消息时,用PeekMessage函数强制让主对话框线程把消息队列中的On_Paint消息处理完即可

CDaoDatabase类简介

 

    CDaoDatabase是MFC中的类。类CDaoDatabase代表了一个数据库连接。使用它可以操纵数据库中的数据。有关支持的数据库格式,请参阅成员函数GetName。在一个给定工作区(由CDaoWorspace对象代表)中,同时可以有多个活动的CDaoDatabase对象。工作区维护了一组开放数据库对象——数据库连接。

    注意:MFC DAO数据库类与那些基于ODBC的MFC数据库类是不同的。所有的DAO数据库类的名字都有CDao前缀。类CDaoDatabase提供了一个类似于ODBC类CDabase的接口。二者主要的不同在于:CDatabse是通过ODBC和ODBC驱动程序存取数据库的,而CDaoDatabase则是通过数据存取对象(Data Acess Object,DAO)存取数据库的。DAO基于Microsoft Jet数据库引擎。一般说来,基于DAO的MFC类比基于ODBC的类处理能力更强。基于DAO的类可以通过ODBC驱动也可以经由自己的数据库引擎存取数据。基于DAO的类也支持数据定义操作(DDL),比如不用直接调用DAO而通过类建立表。

 

用法

    在创建记录集时,可以隐式地建立数据库对象。通过CDaoDatabase显式地使用一个已有的数据库,只需进行如下其一的操作:

    ·构造一个CDaoDatabase对象,向打开的CDaoWorkspace对象传送它的指针。

    ·或者不指定工作区而构造一个CDaoDatabase对象(MFC会建立一个临时的工作区)。

    建立一个新的Microft Jet数据库(.MDB),要构造一个CDaoDatabase对象并且调用它的成员函数Create。 在调用Create之后不要再调用Open。

    打开一个现有的数据库,要构造一个CDaoDatabase对象并且调用它的成员函数Open。

    所有这些方法都把DAO数据库对象添加到工作区的Databases集合中,并和其中的数据建立一个连接。以后需要构造CDaoRecordset、CDaoTableDef或CDaoQueryDef对象来操纵连接的数据库时,要向它们的构造函数传送CDaoDatabase对象的指针。使用完连接之后,要调用成员函数Close并销毁CDaoDatabase对象。Close会关闭所有之前没有关闭的记录集。

 

操作

    在工作区级支持数据库的操作处理。参阅类CDaoWorkspace的成员函数BeginTrans,CommuitTrans和Rollback。有关更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DaoWorkspace:管理事务”。

 

ODBC连接

    建议在使用ODBC数据源时把外部表连到一个Microsoft Jet数据库(.MDDB)。有关更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO扩展:处理外部数据源”。

 

集合

    每个数据库都拥有自己的表定义、查询定义、记录集和关系对象的集合。类CDaoDatabase提供了操纵这些对象的成员函数。

    注意:上述对象存储在DAO中,而不是存储在ODBC对象中。MFC提供了支持表定义、查询定义和记录集对象的类,但没有支持关系对象的类。

    要了解有关CDaoDatabase的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO 数据库”。

#include <afxdao.h>

 

CDaoDatabase类成员

数据成员

m_pWorkspace

包含了数据库并定义了事务空间的CDaoWorkspace对象的指针 

 m_pDAODatabase

所属的DAO数据库对象的指针

构造函数

CDaoDatabase 

构造一个CDaoDatabase对象。调用Open可以与数据库建立连接

属性

CanTransact

如果数据库支持事务,则返回非零值

CanUpdate 

如果CDaoDatabase对象是可更新的,返回非零值

GetConnect 

返回连接数据库的连接参数(连接字符串)。用于ODBC

GetName 

返回当前使用的数据库的名字 

GetQueryTimeout 

返回对数据库查询操作设置的超时时间(以秒为单位)。影响随后的打开、增加、更新和编辑操作以及ODBC数据源上的其它操作(如Execute调用)

GetRecordsAffected 

返回最后一次更新、编辑、增加操作或Execute调用所影响的记录数

GetVersion 

返回与数据库相关的数据库引擎的版本

IsOpen 

如果CDaoDatabase对象正连接到数据库上,则返回非零值

SetQueryTimeout 

设置数据库查询操作的超时时间(以秒为单位)。仅用于ODBC数据源。影响随后所有的打开、添加、更新和删除操作 

操作

Close 

关闭数据库连接。

Create 

创建下面的DAO数据库对象并初始化CDaoDatabase对象

CreateRelation 

在数据库中的表之间定义一个新的联系

DeleteQueryDef 

删除数据库的QueryDefs集合中的一个查询定义对象

DeleteRelation 

删除数据库中表之间的一个联系

DeleteTableDef 

删除数据库中某个表定义。将删除表定义和表中的数据

Execute 

执行一个查询。为查询调用Execute可以返回结果,在出错时会产生异常

GetQueryDefCount 

返回数据库中查询的个数

GetQueryDefInfo 

返回数据库中指定查询的定义信息

GetRelationCount 

返回数据库中表之间定义的联系的个数 

GetRelationInfo 

返回数据库中指定的表间联系的信息

GetTableDefCount 

返回数据库中表的个数

GetTableDefInfo 

返回数据库中指定表的信息

Open 

建立一个数据库连接

 

 

CDaoDatabase类成员函数调用格式及功能

CDaoDatabase::CanTransact

BOOL CanTransact( );

  throw( CDaoExeception, CMemoryException );

返回值:

如果数据库支持事务,则返回非零值,否则为0。

说明:

本函数用于检测数据库是否支持事务。事务在数据库的工作区中处理。有关事务的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO工作区:管理事务”。

 

CDaoDatabase::CanUpdate

BOOL CanUpdate( );

  throw( CDaoException, CMemoryException );

返回值:

如果CDaoDatabase对象允许更新,则返回非零值,否则为0,说明在打开CDaoDatabase对象时bReadOnly为TRUE,或者数据库本来就是只读的。参阅Open。

说明:

本函数用于检测CDaoDatabase对象是否允许更新。有关数据库是否可以更新的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO记录集:记录集操作”和DAO帮助中的“可更新的特性”。

 

CDaoDatabase::CDaoDatabase

CDaoDatabase::(CDaoWorkspace* pWorkspace = NULL );

参数:

pWorkspace  一个CDaoWorkspace指针。将记下新创建的数据库对象。如果使用了缺省值NULL,本构造函数将创建一个使用缺省的工作区的临时CDaoWorkspace对象。可以通过数据成员m_pWorkspace获得工作区对象的指针。 

说明:

本函数构造一个CDaoDatabase对象。在构造该对象之后,如要建立一个新的Microsoft Jet数据库,可以调用它的成员函数Create。如果是打开一个现有的数据库,则调用成员函数Open。

当使用完该对象之后,需要调用它的Close函数并随后撤消它。

有时在文档类中嵌入CDaoDatabase对象很有用。

注意:

如果在打开CDaoRecordset对象时没有指定一个CDaoDatabase对象指针,也会隐式地建立一个CDaoDatabase对象。在关闭该记录集时也就关闭了这个CDaoDatabase对象。

    要了解有关工作区的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO工作区”。有关使用CDaoDatabase对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO 数据库”。

 

CDaoDatabase::Close

virtual void Close( );

说明:

本函数将断开与数据库的连接并关闭该数据库的所有记录集、表定义和查询定义。最好在调用本函数之前自己关闭这些对象。关闭CDaoDatabase对象就是在工作区中的数据库集合里删除它。但是Close并不会撤消该对象,此后还可以再用它来打开数据库。

警告:

如果有没有真正提交的编辑操作,关闭数据库之前要调用Update和所有打开的记录集上的Close函数。在退出一个在堆栈中创建CDaoRecordset或CDaoDatabase对象的函数时,将关闭数据库,将丢失所有未保存的修改,所有未提交的事务都会回滚,所有未提交的修改将丢失。

警告:

如果在还有打开的记录集对象时试图关闭数据库,或者在工作区中还有打开的数据库时关闭该工作区,未关闭的记录集将会被关闭,而所有未提交的修改将被回滚。

如果在关闭工作区对象时还有打开的数据库对象,则在关闭工作区的同时也会关闭这些数据库对象,从而也关闭那些没有关闭的记录集对象。如果没有关闭数据库对象,在MFC的调试状态下会报告一个断言失败错误。

如果数据库对象是在函数之外定义的,而在退出函数时没有关闭它,数据库对象将一直保持打开,直到显式地关闭它或者它所在的模块不再有效了。

要了解有关CDaoDatabase对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO 数据库”。相关信息,可以参阅DAO帮助中的“Close方法”。

 

CDaoDatabase::Create

virtual void Create( LPCTSTR lpszName, LPCTSTR lpszLocale = dbLangGeneral, int dwOptions = 0 );

  throw( CDaoException, CMemoryException );

参数:

lpszName  字符串表达式,指明待创建的数据库文件的名字。可以带全路径名,如“C://MYDB.MDB”。文件名不能省略,但可以省略扩展名。缺省的扩展名为.MDB。如果网络支持唯一命名约定(Uniform NamingConvention,UNC),那么也可以使用网络路径,如“MYSERVER//MYSHARE//MYDIR//MYDB”。此成员函数只能创建Microsoft Jet(.MDB)数据库文件(文件路径表达式中要采用双反斜杠“//”,因为反斜杠“/”是C++中的控制符。) 

lpszLocale  字符串表达式。用于指定创建数据库时的理序。缺省值为dbLangGeneral。可能的取值如下:

·  dbLangGeneral  英语、德语、法语、葡萄牙语、意大利语和现代西班牙语 

·  dbLangArabic  阿拉伯语 

·  dbLangCyrillic  俄语 

·  dbLangCzech  捷克语 

·  dbLangDutch  荷兰语 

·  dbLangGreek  希腊语 

·  dbLanghebrew  希伯莱语 

·  dbLangHungarian  匈牙利语 

·  dbLangIcelandic  冰岛语 

·  dbLangNordic  北欧语(仅有Microsoft Jet数据库引擎1.0版支持) 

·  dbLangNorwdan  挪威语 

·  dbLangPolish  波兰语 

·  dbLangSpanish  传统西班牙语 

·  dbLangSwedfin  瑞典语和芬兰语 

·  dbLangTurkish  土耳其语 

dwOptions  一个标识了一个或多个选项的整数。可能的值如下:

·  dbEncrypt  创建一个加密的数据库

·  dbVersion10  创建Microsoft Jet数据库1.0版的数据库 

·  dbVersion11  创建Microsoft Jet数据库1.1版的数据库 

·  dbVersion20  创建Microsoft Jet数据库2.0版的数据库 

·  dbVersion30  创建Microsoft Jet数据库3.0版的数据库 

    如果忽略了加密常量,则创建的是未加密的数据库。与版本有关的常量只能指定其中的一个。缺省的版本是Microsoft Jet数据库3.0版。

警告:

如果数据库没有加密,即使设置了用户/口令,用户也可以通过操作系统直接读写数据库对应的磁盘文件。

说明:

在构造了一个CDaoDatabase对象之后,就可以调用此函数创建一个新的Microsoft Jet数据库。它创建数据库文件以及其下的DAO数据库对象,并初始化该C++对象。该DAO数据库对象被添加到相应工作区中的Databases集合中。此时数据库对象已经处于打开状态了,在调用Create后不需要再调用Open来打开数据库对象。

    注意:使用此函数只能创建Microsoft Jet数据库(.MDB),而不能创建ISAM数据库或ODBC数据库。

    要了解有关数据库的更详细的信息,请参阅参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。相关信息,可以参阅DAO帮助中的“CreateDatabase方法”。

 

CDaoDatabase::CreateRelation

void CreateRelation( LPCTSTR lpszName,

                     LPCTSTR lpszTable,

                     LPCTSTR lpszForeignTable,

                     long lAttributes,

                     LPCTSTR lpszField,

                     LPCTSTR lpszForeignField

                   );

  throw( CDaoException, CMemoryException );

void CreateRelation( CDaoRelationInfo& relinfo );

  throw( CDaoException,CMemoryException );

参数:

lpszName  关系对象的唯一命名。名字必须以字母打头,最多可以有40个字符。可以有数字和下划线,但不能包含标点符号和空格。 

lpszTable  关系中主表的名字。如果指定的表不存在,MFC会产生一个CDaoExecption类型的异常。 

lpszForeignTable  关系中外表的名字。如果指定的表不存在,MFC会产生一个CDaoExecption类型的异常。 

lAttributes  关系的类型。是一个long型值。可以用它来增强参照完整性。可以使用位操作OR(|)组合下面的值(只要该组合是有意义的)。

·  dbRelationUnique  一对一的关系。 

·  dbRelationDontEnforce  非强制关系(没有参照完整性限制)。 

·  dbRelationInherited  关系的两个表不在当前数据库中。 

·  dbRelationUpdateCacade  级联更新(参阅说明部分对级联更新的解释)。 

·  dbRelationDeleteCacade  级联删除。 

 

lpszField  指向字符串(以null结尾)的指针。字符串中包含了主表(由lpszTable指定)的字段名。 

lpszForeignField  指向字符串(以null结尾)的指针。字符串中包含了外表(由lpszForeignTable指定)的字段名。 

rRefinfo  对一个CDaoRelationInfo对象的参考。该对象包含了待创建的关系的有关信息。 

说明:

本函数用于在主表的一个或多个字段与外表的一个或多个字段间建立一个关系。关系不能用于查询或从外部数据库来的表。如果两个表都只用一个字段,则可以采用本函数的第一个版本。否则就使用第二个版本。单个关系中使用的字段的最大个数为14。

    本函数创建了一个DAO关系对象,但这是MFC的实现细节,因为MFC在类CDaoDatabase中实现了对关系对象的封装。MFC未提供关系类。

    如果关系对象的属性设置允许级联操作,在关系的主表的记录改变或删除时,数据库引擎就会自动地更新或删除一个或多个相关表中的相关记录。例如,假设在Customers表和Orders表之间建立了一个允许级联删除的关系。在Customers表中删除记录时,Orders表中与被删除记录相关的记录也会被删除。此外,如果在Orders表与其它的表之间也建立了允许级联删除的关系,则在Customers表中删除记录时,那些表的相关记录也会被删除。更详细的信息,请参阅DAO帮助中的“CreateRelation方法”。

 

CDaoDatabase::DeleteQueryDef

void DeleteQueryDef( LPCTSTR lpszName );

  throw( CDaoException, CMemorryException );

参数:

lpszName  待删除的查询名。 

说明:

本函数用于从CDaoDatabase对象的QueryDefs集合中删除一个指定的查询定义——保存起来的查询。此后,该查询就不在数据库中了。要了解有关创建查询定义对象的信息,请参阅类CDaoQueryDef。如果在构造CDaoQueryDef对象时给构造函数传递了数据库对象的指针,则构造出来的查询定义对象就与该CDaoDatabase对象相联系了。

    要了解有关查询定义的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。相关信息,可以参阅DAO 帮助中的“Delete方法”。

 

CDaoDatabase::DeleteRelation

void DeleteRelation( LPCTSTR lpszName );

  throw( CDaoException, CMemoryException );

参数:

lpszName  待删除的关系名。 

    说明:本函数从数据库对象的关系集合中删除一个关系。此后该关系就不存在了。

    相关信息,请参阅DAO帮助中的“Delete方法”。

 

CDaoDatabase::DeleteTableDef

void DeleteTableDef( LPCTSTR lpszName );

  throw( CDaoException, CMemoryException );

参数:

lpszName  待删除的表定义的名字。 

说明:

本函数从数据库对象的TableDefs集合中删除指定的表及其数据。此后该表就不在数据库中了。

警告:

千万不要删除系统表。

    要了解有关创建表定义对象的信息,请参阅类CDaoTableDef。如果在构造CDaoTableDef对象时给构造函数传递了数据库对象的指针,则构造出来的表定义对象就与该CDaoDatabase对象相关系了。

要了解有关表定义的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO TableDef”。相关信息,可以参阅DAO 帮助中的“Delete方法”。

 

CDaoDatabase::Execute

void Execute( LPCTSTR lpszSQL, int nOptions = 0);

  throw( CDaoException,CMemoryException );

参数:

lpszSQl  指向一个以null结尾的字符串。该字符串是一个待执行的有效SQL语句。 

nOptions  一个指定查询完整性选项的整数。可以使用位操作OR(|)组合下述的常量(假设该组合是有意义的——例如,不能组合使用dbInconsistent和dbConsistent)。

·  dbDenyWrite  不允许其它用户同时在写。 

·  dbInconsistent  (缺省设置)不一致更新。 

·  dbConsistent  一致更新。 

·  dbSQLPassThrough  传送SQL语句。即把SQL语句传送给ODBC数据源处理。 

·  dbFailOnError  出错时回滚更新。 

·  dbSeeChanges  其它用户正在改变本用户正编辑的数据,则产生运行时错误。 

 注意:

如果dbInconsistent和dbConsistent都被选中,或者都没有选中,则采用缺省设置dbInconsistent。有关这些常量的解释,请参阅DAO帮助中的“Execute方法”。

说明:

本函数用于在数据库上执行动作查询或SQL命令。它只用于不返回结果的动作查询和SQL命令。它不能用于选择查询,因为选择查询会返回结果。

    要了解有关动作查询的定义,请参阅DAO帮助中的“动作查询”和“Execute方法”。

提示:

在给出了语法上正确的SQL语句并有相应的权限,Execute可以同时修改或删除多行。不过,在使用Execute进行更新或删除时,最好使用dbFailOnError选项。设置了该选项后,如果有的待更新或删除的记录被别的用户上了锁,MFC就会产生一个CDaoException类型的异常并回滚此调用中所有成功的修改。总可以调用GetRecordsAffected来查看Execute调用影响到的记录数。调用GetRecordsAffected可以查看最近的Execute调用影响到的记录数。例如,它可以返回一次动作查询中删除、更新或插入的记录数。注意,返回的数目没有反映级联更新或级联删除的效应。

    Execute函数不返回记录集。如果使用它执行一个要返回记录集的查询,MFC将会产生一个CDaoException类型的异常(没有对应于CDatabase::ExecuteSQL的ExecuteSQL成员函数)。

    要了解有关使用Execute函数的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO QueryDef:使用查询定义”

 

CDaoDatabase::GetConnect

CString GetConnect( );

  throw( CDaoException, CMemoryException );

返回值:

如果此前在ODBC数据源上已成功地调用Open函数,则返回连接(字符)串。否则,返回空串。对于Microsoft Jet数据库来说,通常返回的都是空串;除非在使用Execute的选项dbSQLPassThrough时设置了它,或者是在打开记录集时使用了它。

说明:

本函数返回把CDaoDatabase对象连接到一个ODBC数据源或ISAM数据库时使用的连接串。连接串提供了开放数据库的数据源的信息或在传送式查询中使用的数据库的信息。它由数据库类型描述符由0个或多个由分号隔开的参数组成。有关DAO中的连接串的更详细的信息,请参阅DAO帮助中的“Connect属性”部分。

重点:

采用MFC的DAO类通过ODBC连接到数据源比用附加表(attachedtable)连接效率要低一些。要了解更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO 扩展: 使用外部数据源”。

注意:

连接串用于在必要时向ODBC或ISAM驱动程序传送附加的信息。对于.MDB数据库来说是不必要的。对Microsoft Jet数据库中的基表,连接串为空串,除非在SQL传送型查询中使用了它(参阅上面的“返回值”部分)。

至于连接串是如何创建的,请参阅Open函数。一旦在Open调用中设置了连接串,以后就可以用它来检查设置,判断数据库的类型、路径、用户ID、口令及ODBC数据源。

 

CDaoDatabase::GetName

CString GetName( );

  throw( CDaoException, CMemoryException );

返回值:

调用成功时返回数据库文件的全路径和文件名。否则返回一个空的CString对象。

说明:

本函数用来取得当前打开的数据库的名字,即数据库文件的名字或注册的ODBC数据源的名字。如果网络支持唯一命名约定(Uniform NamingConvention,UNC),那么也可以使用网络路径,如“MYSERVER//MYSHARE//MYDIR//MYDB”。(文件路径表达式中要采用双反斜杠“//”,因为反斜杠“/”是C++中的控制符。)

取出的数据库名可以用作标题。如果函数出错,则产生一个CDaoException类型的异常。

重点:

在存取外部数据库时,为提高效率,建议把外部数据库的表附加到一个Microsoft Jet引擎数据库,而不要直接地连接到该数据源。

数据库类型由路径中的目录名或文件名指明,如下:

路径名指向

  数据库类型 

MDB文件

Microsoft Jet 数据库(Microsoft Access)

包含.DBF文件的目录

dBASE数据库

包含.XLS文件的目录

Microsoft Excel数据库

包含.DBF文件的目录

Microsoft Foxpro数据库

包含.PDX文件的目录

Paradox数据库

包含相应格式的文本数据库文件的目录

文本格式的数据库

对于ODBC数据库,如Microsoft SQL Server和Oracle,数据库连接串标志了一个在ODBC中注册了的数据源名字(Data Source Name,DSN)。要了解有关附加外部表的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO扩展:附加外部表”。

 

CDaoDatabase::GetQueryDefCount

short GetQueryDefCount( );

  throw( CDaoException, CMemoryException );

返回值:

返回数据库中定义的查询的个数。

说明:

本函数返回数据库对象的QueryDefs集合中定义的查询的个数。在需要使用QueryDefs中的每个查询定义时,调用此函数很有用。取得指定查询的信息,可以调用函数GetQueryDefInfo。

要了解有关查询和查询定义对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO 查询”和”DAO查询定义”。

 

CDaoDatabase::GetQueryDefInfo

void GetQueryDefInfo( int nIndex, CDaoQueryDefInfo& querydefinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );

  throw( CDaoException, CMemoryException );

void GetQueryDefInfo( LPCTSTR lpszName ,CDaoQueryDefInfo& querydefinfo , DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );

  throw( CDaoException, CMemoryException );

参数:

nIndex  在数据库的QueryDefs集合中定义的查询的索引(下标)。 

querydefInfo  对CDaoQueryDefInfo对象的一个参考。该对象记录了返回的信息。 

dwinfoOptions  指定从记录集中检索什么信息的选项。可用的选项如下:

·  AFX_DAO_PRIMARY_INFO  (缺省)名字,类型 

·  AFX_DAO_SECONDARY_INFO  名字、类型加上创建日期、最后修改日期、返回的记录数和是否允许更新 

·  AFX_DAO_ALL_INFO  上面的两种设置中的信息加上SQL语句、连接和ODBC超时设置   

lpszName  字符串。包含了数据库中定义的查询的名字,用于按名查找。 

说明:

本函数用于获取数据库中定义的某个查询的各种信息。本函数的两个版本分别用于按数据库中QueryDefs集合中查询的索引查找和按名查找。

要了解有关在querydefinfo中返回的信息的说明,请参阅CDaoQueryDefInfo结构。该结构中有与上面对dwInfoOptions的描述中列出的信息项对应的成员。请求某一层次的信息,就包括了上一层次的信息(如设置AFX_DAO_SECONDARY_INFO时取得的信息包括了设置AFX_DAO_PRIMARY_INFO时取得的信息)。

要了解有关查询和查询定义对象的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO查询”和”DAO查询定义”。

 

CDaoDatabase::GetQueryTimeOut

short GetQueryTimeOut( );

  throw( CDaoException, CMemoryException );

返回值:

返回一个短整数。记录了以秒为单位的超时时间设置。

说明:

本函数返回在数据库上进行操作所设置的超时时间(以秒为单位)。操作超时可能是因为网络存取问题、查询处理的时间太长等等。超时设置影响所有在CDaoDatabase对象相关的记录集上的打开、增添、更新和删除操作。可以调用SetQueryTimeout更改当前的超时设置。在记录集打开之后改变超时设置,不会影响记录集采用的超时时间值。例如,随后的Move操作不会使用新设置的值。缺省值在数据库引擎初始化时进行初始化。

查询超时设置的缺省值在Windows注册表中取得。如果注册表中没有设置,则缺省值取60秒。但是并非所有的数据库都支持查询的超时设置。如果把查询的超时设置为0,就不会发生任何超时;与数据库的通信会挂起。在开发的过程中这是很有用的。如果调用本函数失败,MFC会产生一个CDaoExecption类型的异常。

要了解有关数据库对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。相关信息,请参阅DAO帮助中的“QueryTimeout特性”。

 

CDaoDatabase::GetRecordsAffected

long GetRecordsAffected( );

  throw( CDaoException, CMemoryException );

返回值:

一个long型整数。记录了受影响的记录数。

说明:

本函数用于检测最近一次Execute调用所影响的记录数。返回值包括了由Execute执行的查询中删除、更新或插入的记录数。在使用级联规则时级联更新或删除的相关表的记录不计在内。

要了解有关数据库对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”相关信息。与本函数有关的信息,请参阅DAO帮助中的“RecordsAffected特性”。

 

CDaoDatabase::GetRelationCount

short GetRelationCount( );

  throw( CDaoException, CMemoryException );

返回值:

返回在数据库中定义的表间关系的个数。

说明:

本函数用于取得数据库中定义的表间关系的个数。在需要使用数据库的Releations集合中的每个关系的定义时,调用此函数很有用。调用函数GetRelationInfo可以取得指定关系的信息。

为考察关系这个概念,考虑表Suppliers和表Products,它们之间具有一对多的关系。在这个关系中,一个供应者可以供应一种或多种产品。此外的两种关系是一对一和多对多。

要了解有关数据库对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。

 

CDaoDatabase::GetRelationInfo

void GetRelationInfo(int nIndex, CDaoRelationInfo& relinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );

  throw( CDaoException, CMemoryException );

void GetRelationInfo( LPCTSTR lpszName, CDaoRelationInfo& relinfo,DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );

  throw( CDaoException, CMemoryException );

参数:

nIndex  关系在数据库的Relations集合中的索引。用于按索引查找。 

refinfo  对一个CDaoRelationInfo对象的参考,记录了函数调用返回的信息。 

dwInfoOptions  指定从关系中检索哪些信息的选项。可用的选项如下:

·  AFX_DAO_PRIMARY_INFO    (缺省)名字、表和外表 

·  AFX_DAO_SECONDARY_INFO    AFX_DAO_PRIMARY_INFO指定的信息加上属性和字段信息。字段信息是一个CDaoRelationFieldInfo对象,记录了关系的主表的字段。 

lpszName  字符串。包含了关系对象的名字,用于按名查找。 

说明:

本函数用于取得数据库中指定关系的有关信息。它的两个版本分别用于按名检索和按索引检索。有关在refinfo中返回的信息的说明,请参阅结构CDaoRelationInfo。该结构中有对应于上面所述的dwInfoOptions选项的成员。

注意:

如果把关系对象的级联操作设成了活动状态,则在改变关系的主表中的记录时,Microsoft Jet数据库引擎会自动地更新或删除一个或多个相关表中的记录。例如,假设在Customers表和Orders表之间建立了一个允许级联删除的关系。在Customers表中删除记录时,Orders表中与被删除记录相关的记录也会被删除。此外,如果在Orders表与其它的表之间也建立了允许级联删除的关系,则在Customers表中删除记录时,那些表的相关记录也会被删除。

要了解有关数据库对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。

 

CDaoDatabase::GetTableDefCount

short GetTableDefCount();

  throw( CDaoException, CMemoryException );

返回值:

返回在数据库中定义的表定义的个数。

说明:

本函数用于检索数据库中定义的表的个数。如果要对数据库的TableDefs集合中的所有表定义进行操作,调用本函数很有用。要取得指定表的信息,请参阅GetTableDefInfo。

 

CDaoDatabase::GetTableDefInfo

void GetTableDefInfo ( int nIndex, CDaoTableDefInfo& tabledefinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );

  throw( CDaoException, CMemoryException );

void GetTableDefInfo ( LPCTSTR lpszName, CDaoTableDefInfo& tabledefinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );

  throw( CDaoException, CMemoryException );

参数:

nIndex  数据库中TableDefs集合中表定义的索引,用于按索引查找。 

tabledefinfo  对一个CDaoTableDefInfo结构的参考,记录了返回的信息。 

dwinfoOptions  指定从表定义中检索哪些信息的选项。可用的选项如下:

·  AFX_DAO_PRIMARY_INFO  (缺省设置)名字、是否允许更新和属性 

·  AFX_DAO_SECONDARY_INFO  AFX_DAO_PRIMARY_INFO指定的信息加上:创建日期、最后修改日期、源表名和连接 

·  AFX_DAO_ALL_INFO  AFX_DAO_SECONDARY_INFO指定的信息加上有效性规则、有效性规则文本和记录数   

lpszName  指明表定义对象的名字的字符串,用于按名查找。 

说明:

本函数用于取得数据库中某个表定义的信息。它的两个版本分别用于按名检索和按索引检索。

要了解有关在tabledefinfo中返回的信息的说明,请参阅结构CDaoTableDefInfo。该结构中有对应于上面所述的dwInfoOptions选项的成员。

警告:

设置选项AFX_DAO_ALL_INFO获取信息可能会比较慢。因为计算表中的元组数在表中元组很多时是比较耗时的。

要了解有关表和表定义对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO TableDef”。

 

CDaoDatabase::GetVersion

CString GetVersion( );

  throw( CDaoException, CMemoryException );

返回值:

返回一个CString对象,其中记录了数据库对象相关的数据库文件的版本。

说明:

本函数用于检测Microsoft Jet数据库文件的版本。返回值以“主版本号.次版本号”的形式表示取得的版本(如3.0)。产品版本号由版本号(如3)、句点(.)和发行版本号(如0)组成。目前支持的版本有:1.0、2.0和3.0。

要了解有关数据库对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。

 

CDaoDatabase::IsOpen

BOOL IsOpen( ) const;

返回值:

如果CDaoDatabase对象已经打开,则返回非零值,否则为0。

说明:

本函数用于检测某个CDaoDatabase对象当前是否处于打开状态。

要了解有关数据库对象的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。

 

CDaoDatabase::Open

virtual void Open( LPCTSTR lpszName, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T(""));

  throw( CDaoException, CMemoryException );

参数:

lpszName  指定Microsoft Jet数据库文件名的字符串。如果该文件带有扩展名,也需要写上。如果用户的网络支持唯一命名约定(UNC),则也可以使用网络路径,例如“MYSERVER//MYSHARE//MYDIR//MYDB”(文件路径表达式中要采用双反斜杠“//”,因为反斜杠“/”是C++中的控制符)。

使用lpszName时有些需要注意的地方:

·  如果指定的数据库文件已经被其它用户独占使用,则MFC会产生一个CDaoException类型的异常。可以捕获该异常以通知用户该数据库不可用。 

·  如果指定的是一个空串(“”),并且lpszConnect是“ODBC”,则会显示一个对话框,列出所有注册的ODBC数据源的名字,用户可以在列表中选择一个数据源。编程时最好避免直接地连接数据源,而采用关联表。要了解更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO 扩展: 使用外部数据源” 

·  如果参考的数据库不存在或者ODBC数据源无效,MFC会产生一个CDaoException类型的异常。 

注意:

DAO的错误代码,请参阅头文件DAOERR.H。相关的文档有DAO帮助中的“可捕获的数据访问错误” 

bExclusive  一个布尔值,独占打开数据库时设置为TRUE,否则设置为FALSE(共享打开)。该参数未设置时,默认为共享打开方式。 

bReadOnly  一个布尔值。如果以只读方式打开数据库,则设置为TRUE,否则设置为FALSE(以读/写方式打开)。未设置该参数时,数据库以读/写方式打开。所有相关的记录集继承这个设置。 

lpszConnect  用于打开数据库的字符串。该字符串构成了ODBC连接的参数。必须指定独占的和只读参数以提供源字符串。相关语法,请参阅DAO帮助中的“Connect 特性”。如果待连接的数据库是一个Microsoft Jet数据库(.MDB),这个串为空(“”)。缺省值的语法_T(“”)同时提供了对Unicode和ANSI字符集的支持。 

说明:

必须调用本函数对一个代表某个现存数据库的CDatabase对象进行初始化。它建立数据库和其下的DAO对象的联系。在初始化数据库对象之前是不能用它来构造记录集、表定义或查询对象的。本函数会把数据库对象添加到相关工作区的Databases集合中。

 

CDaoDatabase::SetQueryTimeOut

void SetQueryTimeOut( short nSeconds );

  throw( CDaoException, CMemoryException );

参数:

nSeconds  以秒为单位设置的查询超时时间。 

说明:

本函数用于设置在连接的数据库上进行操作的超时时间。操作超时可能是因为网络存取的问题,或查询处理时间过长等等。想改变以后的查询的超时设置,就可以在打开记录集或在调用记录集的AddNew,Update或Delete成员函数之前调用本函数。本函数的超时设置影响此后所有与本CDatabase对象相关的记录集上的Open,AddNew,Update和Delete调用。在打开记录集之后调用本函数设置超时时间不会影响记录集的超时时间。例如,此后的Move操作就不使用设置的新值。缺省的超时时间是60秒。但是并非所有的数据库都支持超时时间的设置。如果把超时时间设置为0,则实际上不会发生超时;与数据库的通信会被挂起。在开发过程中这可能比较有用。

相关信息,请参阅DAO帮助中的“QueryTimeout特性”。

 

CDaoDatabase::m_pDAODatabase

说明:

m_pDAODatabase包含了一个指向CDatabase对象下的DAO数据库对象的OLE接口的指针。在需要直接存取DAO接口时可以使用该指针。

要了解有关DAO数据库的更详细的信息,请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。有关直接调用DAO的信息,请参阅“技术指南54”。

 

CDaoDatabase::m_pWorkspace

说明:

m_pWorkspace包含了一个指向本数据库对象所在的工作区的指针。在需要直接存取工作区时可以使用此指针,例如获得工作区中Databases集合中其它数据库对象的指针。



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值