ODBC和ADO.docx

上传人:b****3 文档编号:4198466 上传时间:2023-05-06 格式:DOCX 页数:16 大小:23.80KB
下载 相关 举报
ODBC和ADO.docx_第1页
第1页 / 共16页
ODBC和ADO.docx_第2页
第2页 / 共16页
ODBC和ADO.docx_第3页
第3页 / 共16页
ODBC和ADO.docx_第4页
第4页 / 共16页
ODBC和ADO.docx_第5页
第5页 / 共16页
ODBC和ADO.docx_第6页
第6页 / 共16页
ODBC和ADO.docx_第7页
第7页 / 共16页
ODBC和ADO.docx_第8页
第8页 / 共16页
ODBC和ADO.docx_第9页
第9页 / 共16页
ODBC和ADO.docx_第10页
第10页 / 共16页
ODBC和ADO.docx_第11页
第11页 / 共16页
ODBC和ADO.docx_第12页
第12页 / 共16页
ODBC和ADO.docx_第13页
第13页 / 共16页
ODBC和ADO.docx_第14页
第14页 / 共16页
ODBC和ADO.docx_第15页
第15页 / 共16页
ODBC和ADO.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ODBC和ADO.docx

《ODBC和ADO.docx》由会员分享,可在线阅读,更多相关《ODBC和ADO.docx(16页珍藏版)》请在冰点文库上搜索。

ODBC和ADO.docx

ODBC和ADO

MFC中的ODBC类和ADO类

1、MFC的ODBC类:

MFC的ODBC类对较复杂的ODBCAPI进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发。

程序员不必了解ODBCAPI和SQL的具体细节,利用ODBC类就能完成对数据库的大部分操作。

1、MFC的ODBC类主要包括:

1.1、CDatabase类:

主要是建立与数据源的连接。

为了使用CDatabase类,必须包含以下头文件:

#include

1.1.1、数据成员:

✓HDBCM_hdbc;//是对数据源的开放数据库连接(ODBC)的连接句柄,用来表示某次ODBC数据源的连接。

1.1.2、成员函数:

1.1.2.1、CDatabase():

构造函数

构造一个CDatabase对象,必须通过调用OpenEx和Open初始化这个对象。

1.1.2.2、Open()函数:

函数原型:

virtualBOOLOpen(LPCSTRlpszDSN,BOOLbExclusive=FALSE,BOOLbReadOnly=FALSE,LPCSTRlpszConnect=”ODBC;”,BOOLbUseCursorLib=TRUE);

throw(CDBException,CmemoryException);

如果成功形成连接,则返回非0值。

功能:

打开新构造的CDatabase对象,并将它初始化。

1.1.2.3、OpenEx()函数:

函数原型:

virtualBOOLOpenEx(LPCSTRlpszConnectString,DWORDdwOption=0);

throw(CDBException,CmemoryExption);

功能:

建立到数据源的一个连接(通过ODBC驱动程序),打开一个新构造的CDatabase对象,并将它初始化。

1.1.2.4、Close()函数:

函数原型:

virtualvoidClose();

功能:

关闭与某个数据源的连接。

1.1.2.5、GetConnect()函数:

函数原型:

constCString&GetConnect();

功能:

返回用于连接CDatabase对象和数据源的ODBC连接字符串。

1.1.2.6、IsOpen()函数:

函数原型:

BOOLIsOpen();

功能:

用于检验Cdatabase对象是否与某个数据源相连。

如果CDatabase对象当前与数据源连接,则返回非零值。

1.1.2.7、Rollback()函数:

函数原型:

BOOLRollback();

功能:

回滚当前事务期间所做的变化,数据源返回到BeginTrans调用时定义的未改变的以前状况。

1.1.2.8、ExecuteSQL()函数:

函数原型:

voidExecuteSQL(LPCSTRlpszSQL);

Throw(CDBException);

功能:

直接执行一条SQL语句。

1.2、CRecordset类:

该类代表从数据源选择的一组记录(记录集),程序可以选择数据源中的某个表作为一个记录集,也可以通过对表的查询得到记录集,还可以合并同一数据源中多个表的列到一个记录集。

通过该类对记录集中的记录进行滚动、修改、增加和删除等操作。

要使用该类应包含头文件:

afxdb.h。

该类的数据成员和成员函数有:

1.2.1、数据成员:

✓m_nFields//当前记录集合中字段的数目

✓m_nParams//当前记录集合中参数的数目

✓m_strFilter//某个SQL语句的where参数

✓m_pDatabase//指向一个Cdatabase对象的指针

✓m_strSort//某个SQL语句的ORDERBY参数

1.2.2、成员函数:

1.2.2.1、AddNew()函数:

函数原型:

voidAddNew();

Throw(CDBException);

功能:

将一个新记录添加到当前表中。

1.2.2.2、CanAppend()函数:

函数原型:

BOOLCanAppend();

功能:

检测某个记录集是否允许用户添加新记录。

1.2.2.3、CanUpdate()函数:

函数原型:

BOOLCanUpdate();

功能:

检测某个记录集是否能被更新。

1.2.2.4、Close():

函数:

函数原型:

voidClose();

功能:

关闭当前的记录集合。

1.2.2.5、Delete()函数:

函数原型:

virtulvoidDelete();

Throw(CDBException);

功能:

删除当前的记录。

 

1.2.2.6、DoFieldExchange()函数:

函数原型:

virtualvoidDoFieldExrange(CFieldExchange*Pfx);

throw(CDBException);

功能:

在多行记录操作尚未完成期间,在字段和记录集合之间交换数据。

1.2.2.7、Edit()函数:

函数原型:

virtualvoidEdit();

throw(CDBException,CMemoryException):

功能:

编辑当前记录。

1.2.2.8、IsBOF()函数:

函数原型:

BOOLISBOF();

功能:

检测记录指针是否位于当前记录集合的第一个记录的前面。

1.2.2.9、IsEOF()函数:

函数原型BOOLIsEOF();

功能:

检测记录指针是否位于当前记录集合的最后一个记录之后。

1.2.2.10、IsFieldNull()函数:

函数原型:

BOOLIsFieldNull(void*pv);

throw(CMemoryException);

功能:

检测字段是否为NULL。

1.2.2.11、IsOpen()函数:

函数原型:

BOOLIsOpen();

功能:

检测当前记录集合是否已经打开。

1.2.2.12、Move()函数:

函数原型:

virtualvoidMove(longnRows,WORDwFetchType=SQLFETCHRELATIVE);

throw(CDBException,CMernoryException);

功能:

在当前记录集合中,向前或向后移动记录指针。

 

1.2.2.13、MoveFirst()函数:

函数原型:

voidMoveFirst();

throw(CDBException,CMemoryException);

功能:

将记录集合中的第一个记录作为当前记录。

1.2.2.14、MoveLast()函数:

函数原型:

voidMoveLast();

throw(CDBException,CMemoryException);

功能:

将记录集合中的最后一个记录作为当前记录。

1.2.2.15、MoveNext()函数:

函数原型:

voidMoveNext();

throw(CDBException,CMemoryException);

功能:

将记录集合中的下一个记录作为当前记录。

1.2.2.16、MovePrev()函数:

函数原型:

voidMovePrev();

throw(CDBException,CMemoryException);

功能:

将记录集合中的上一个记录作为当前记录。

1.2.2.17、Open()函数:

函数原型:

virtualBOOLOpen(UINTnOpenType=AFX_DB_USE_DEFAULT_TYPE,LPCSTR

LpszSQL=NULL,DWORDdwOptions=none);

throw(CDBException,CMemoryException);

功能:

打开指定的记录集合。

1.2.2.18、Update()函数:

函数原型:

virtualBOOLUpdate();

throw(CDBException);

功能:

在调用AddNew或Edit函数之后调用,以便更新数据。

1.3、CRecordView类:

提供了一个表单视图与某个记录集直接相连,利用对话框数据交换机制(DDX)在记录集与表单视图的控件之间传输数据。

该类支持对记录的浏览和更新,在撤消时会自动关闭与之联系的记录集。

该类负责界面。

CRecordView类对象代表一个视图,用来显示控件中数据库记录。

CRecordView对象只有几个成员函数,IsOnFirstRecord用于检测当前记录是否是某个记录集合中的第一个记录;IsOnLaststRecord用于检测当前记录是否是某个记录集合中的最后一个记录;OnGetRecordset返回一个指针,指向与当前记录相关联的Crecordset对象;OnMove将记录指针移动到指定的记录上。

1.4、CDBException类:

代表ODBC类产生的异常。

CDBExceptionCDBException对象表示数据库类引起的异常条件。

这个类包括两个公用数据成员m_nRetCode和m_strError,可以用来确定异常原因或者显示描述异常的消息。

CDBException对象由数据库类成员函数构造和产生。

这个类是MFC开放数据库连接(ODBC)类之一。

如果用数据访问对象(DAO)类代替,则使用CdaoException代替。

寻常是包括程序控制外部条件在内的异常执行的情况,例如数据源或网络刀O错误。

执行程序的正常过程中预计会看到的错误通常不认为是异常,可以访问CATCH表达式范围内的这些对象,还可以用AfxThrowDBException全局函数从自己的代码产生CDBException对象。

1.5、CFieldExchange类:

负责CRecordset与数据源的数据交换。

CFieldExchange没有基类。

CFieldExchange类用于支持记录字段交换(RFX)和批量记录字段交换(BulkRFX),常被数据库类使用。

如果要对自定义数据类型编写数据交换例程,或批量取数据行,可以直接调用此类。

RFX和BulkRFX在记录集对象的字段数据成员和数据资源的当前记录的相关字段之间交换数据。

如果对数据访问对象类而不是对开放数据库连接类做操作,就应使用CDaoFieldExchange。

CFieldExchange对象提供记录字段交换和批量记录字段交换发生时的相关信息几,支持包括对当前记录约束参数和字段数据成员,设置变量标志位等操作。

RFX和BulkRFX操作在记录集的由enumFieldType的CFieldExchange定义类型的类数据成员上执行,可能的FieldType值为:

字段数据成员的CFieldExchange:

:

outputColumn。

输入参数数据成员的CFieldExchange:

:

inputParam或CFieldExchange:

:

param。

输出参数数据成员的CFieldExchange:

:

outputParam

输入输出参数数据成员的CFieldExchange:

:

inoutParam

大多数类成员函数和数据成员用于编写定制的RFX例程,经常会使用成员函数SetFieldType。

2、MFC的DAO类主要包括:

2.1、CDaoDatabase类

CDaoDatabase类代表了一个数据库连接,通过它可以操纵数据库中的数据。

在一个给定工作区(CDaoWorspace对象)中,同时可以有多个活动的CDaoDatabase对象,工作区维护了一组开放数据库对象。

MFCDAO数据库类与那些基于ODBC的MFC数据库类是不同而又相似的,CDaoDatabase类提供了一个类似于ODBC类CDatabase的接口。

二者主要的不同在于:

CDatabse是通过ODBC和ODBC驱动程序存取数据库的,而CDaoDatabase则是通过数据存取对象(DataAcessObject,DAO)存取数据库的,而DAO是基于MicrosoftJet数据库引擎的。

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

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

以上方法都是把DAO数据库对象添加到工作区的Databases集合中,并和数据库建立一个连接,以后需要构造CDaoRecordset,CDaoTableDef或CDaoQueryDef来操纵连接上的数据库。

当使用完连接的数据库之后,通过调用成员函数Close断开连接并撤消CDaoDatabase对象。

构造CDaoDatabase对象可以指定工作组构造,用构造函数显式地创建CDaoDatabase对象,创建时传递一个CDaoWorspace对象的指针;也可以不指定工作组构造,此时MFC会自动地创建一个临时工作组。

2.1.1、数据成员:

✓m_pWorkspace//包含了数据库并定义了事务空间的CdaoWorkspace对象的指针。

✓m_pDAODatabase//所属的DAO数据库对象的指针。

2.1.2、成员函数:

CDaoDatabase():

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

CanTransact():

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

CanUpdate():

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

GetConnect():

返回连接数据库的连接字符串,用于ODBC。

GetName():

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

GetQuerytimeout():

返回对数据库查询操作设置的超时时间。

GetRecordsAffected()函数:

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

GetVersion()函数:

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

IsOpen()函数:

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

SetQueryTimeout()函数:

设置数据库查询操作的超时时间,仅用于ODBC数据源。

Close()函数:

关闭数据库连接。

Create()函数:

创建DAO数据库对象并初始化CdaoDatabase对象。

CreateRelation()函数:

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

DeleteQueryDef()函数:

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

DeleteRelation()函数:

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

DeleteTableDef()函数:

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

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

Execute()函数:

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

GetQueryDefInfo()函数:

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

GetQueryDefCount()函数:

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

GetRelationCount()函数:

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

GetTableDefInfo()函数:

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

Open()函数:

建立一个数据库连接。

2.2、CDaoRecordset类

一个CDaoRecordset对象表示从数据源中选择的一组记录,它提供了类似CRecordset类的接口。

CDaoRecordset对象有以下三种类型:

✓表型记录集(Table-type):

表示一个基本表,可以用它从单个数据库表中检查、添加、改变或删除记录。

✓动态集型记录(Dynaset-type):

是一个查询的结果,可以包含可更新的记录。

这种记录集是一组记录,可以用它从一个或多个基本数据库表中检查、添加、改变或删除记录。

动态集型记录集包含来自一个数据库中一个或多个表的字段。

✓快照型记录集(Snapshot-type):

是一组记录的一个静态拷贝,可以用它查找数据或生成报表。

这些记录集可以包含来自一个数据库中一个或多个表的记录字段,不过记录不可更新。

每种类型的记录集都表示记录集在打开时所固定的一组记录。

在表型记录集或动态集型记录集中滚动到一个记录时,它可以反映记录集打开后,由其他用户或者应用中其他记录集对记录所做的改动,而快照型记录集不可更新。

可以直接使用CDaoRecordset,也可以从CDaoRecordset派生出一个应用指定记录集。

然后可以利用它完成以下操作:

在记录集中滚动;

设置索引并使用Seek快速查找记录(只对表型记录集);

基于字符串比较:

“<”,“一<=”,“=”,“>=”或“>”的记录查找(对态集型和快照型记录集);

更新记录并指定一种封锁模式(除了数据源中选择的记录);

过滤数据集,以限制它从有效数据源中选择的记录;

排序记录集;

参数化记录集,按运行时才知道的信息定制选择。

CDaoRecordset类提供的接口与类CRecordSet类似,主要区别在于类CdaoRecordset通过基于OLE的数据访问对象(DAO)访问数据。

类CRecordSet通过开放数据库连接(ODBC)和适用于此DBMS的ODBC驱动程序访问DBMS。

既可以直接使用CDaoRecordset,也可以由CDaoRecordset派生出一个类来使用它。

要使用记录集类,需打开一个数据库并构造记录集对象,向构造程序传送一个指传CDaoDatabase对象的指针。

接下来调用记录集的Open成员函数,指定对象是表型、动态集型还是快照型记录集。

然后调用Open从数据库中选择数据并获取第一条记录。

使用对象的成员函数和数据成员,可以滚动并操纵记录。

操作的有效性取决于对象是表型记录集、动态集型记录集还是快照型记录集,以及它是可更新的还是只读的----依赖于数据库或开放数据库连接(ODBC)数据源的功能。

要更新Open调用之后可能已改变或添加的记录,需调用对象的Requery成员函数,结束时调用对象的Close成员函数并销毁这个对象。

CDaoRecordset使用DAO记录字段交换(DFX),以支持通过CDaoRecordset或CDaoRecordset派生类的安全型C++成员对记录字段的读取更新。

部分CDaoRecordset类成员如下:

2.2.1、数据成员:

✓m_pDAORecordset指向记录集对象基础上的DAO接口的一个指针

✓mnFields包含从数据源中由记录集选择的记录集类中字段的数据成员数量和列数

✓mnParams包含记录集类中参数数据成员数量—由记录集查询传递的参数数量

✓m_pDatabase用于这个结果集的源数据库。

包含一个CDaoDatabase对象的指针

✓m_strFilter包含用于构造SQLWHERE语句的一个字符串

✓m_strSort包含用于构造ORDERBY语句的一个字符串

2.2.2、成员函数:

CDaoRecordset构造一个CDaoRecordset对象

Close关闭记录集.

Open从一个表、动态集或快照创建一个新记录集

CanAppend如果可以通过AddNew成员函数把新记录添加到记录集,则返回非零值

CanBookmark如果记录集支持书签,则返回非零值

CanRestart如果可以调用Requery再次运行记录集查询,则返回非零值

CanScroll如果可以在记录中滚动,则返回非零值

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

CanUpdate如果记录集可更新,则返回非零值(可以添加、更新或删除记录)

GetCurrentIndex返回一个Cstring,包含在具有索引的表型CdaoRecordset上最近使用过的索引名

GetDateCreated返回CdaoRecordset对象基础上创建基本表的日期和时间

GetDateLastUpdated返回对CdaoRecordset对象基础上基本表设计最近改变的日期和时间.

GetEditMode返回指示当前记录编辑状态的一个值

GetLastModifiedBookmark用于确定最近添加或更新的记录

GetRecordCount返回在一个记录集对象中访问的记录数

GetSQL获取用于从记录集选择记录的SQL字符串

GetType调用以确定记录集的类型:

表型、动态集型或快照型

GetValidationRule返回包含使输入字段的数据有效的CString值

IsBOF如果记录集定位在第一条记录之前,则返回非零值。

不存在当前记录

IsEOF如果记录集定位在最后一条记录上,则返回非零值

IsFieldD如果当前记录中指定字段发生变化,则返回非零值

IsFieldNull如果当前记录中指定字段置为NULL(不含任何值),则返回非零值

IsFieldNullable如果当前记录中指定字段可以置为NULL(不含任何值),则返回非零值。

IsOpen如果以前调用过Open,则返回非零值。

2.2.3、记录集更新操作:

✓AddNew准备添加一条新记录,调用Update以完成添加

✓Delete从记录集删除当前记录,一删除后必须明确地滚动到第一条记录

✓Edit准备改变当前记录。

调用Update以完成添加

✓Update在数据源存储新的或编辑过的数据以完成AddNew或Edit操作

2.2.4、记录集导航操作:

2.2.4.1、Find在满足指定条件动态集型记录集中,定位满足条件的第一个、下一个、上一个或最后一个位置,并使之成为当前记录

FindFirst在满足指定条件动态集型记录集中,定位满足条件的第一条记录,并使之成为当前记录

FindLast在满足指定条件动态集型记录集中,定位满足条件的最后一条记录,并使之成为当前记录

FindNext:

在满足指定条件动态集型记录集中,定位满足条件的下一条记录,并使之成为当前记录;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2