ADO数据库编程
- 格式:doc
- 大小:231.50 KB
- 文档页数:49
ADO数据库编程数据库访问技术❑ODBC(开放数据库接口)是一种标准的基于SQL的接口,它提供了应用程序与数据库之间的接口,使得任何一个数据库都可以通过ODBC驱动程序与指定的DBMS相连❑DAO使用Jet数据库引擎形成一系列的数据访问对象:数据库对象、表和查询对象、记录集对象等。
可以打开一个Access数据库文件(MDB文件),也可直接打开一个ODBC数据源以及使用Jet引擎打开一个ISAM(被索引的顺序访问方法)类型的数据源(dBASE、FoxPro、Paradox、Excel或文本文件)。
❑OLE DB试图提供一种统一的数据访问接口,并能处理除了标准的关系型数据库中的数据之外,还能处理包括邮件数据、Web上的文本或图形、目录服务(Directory Services)以及主机系统中的IMS和VSAM数据。
OLE DB提供一个数据库编程COM(组件对象模型)接口,使得数据的使用者(应用程序)可以使用同样的方法访问各种数据,而不用考虑数据的具体存储地点、格式或类型。
这个COM接口与ODBC相比,其健壮性和灵活性要高得多。
❑RDO(Remote Data Object),远程数据对象。
由于RDO直接调用ODBC API(而不是像DAO那样通过Jet引擎),所以,可以为使用关系数据库的应用程序提供更好的性能。
❑ADO是目前在Windows环境中比较流行的客户端数据库编程技术。
它是Microsoft为最新和最强大的数据访问范例OLE DB而设计的,是一个便于使用的应用程序层接口。
ADO使用户应用程序能够通过“OLE DB提供者”访问和操作数据库服务器中的数据。
由于它兼具有强大的数据处理功能(处理各种不同类型的数据源、分布式的数据处理等等)和极其简单、易用的编程接口,因而得到了广泛的应用。
❑ADO技术基于COM(Component Object Model,组件对象模型),具有COM组件的许多优点,可以用来构造可复用应用框架,被多种语言支持,能够访问包括关系数据库、非关系数据库及所有的文件系统。
另外,ADO还支持各种B/S与基于Web的应用程序,具有远程数据服务RDS(Remote Data Service)的特性,是远程数据存取的发展方向。
MFC ODBC技术❑MFC的ODBC类对较复杂的ODBC API进行了封装,提供了简化的调用接口❑CDatabase类:主要功能是建立与数据源的连接,可以在整个应用程序中共享这些信息。
❑CRecordset类:代表从数据源选择的一组记录。
CRecordset类允许指定要运行的SQL查询,它将运行查询并维护自数据库返回的记录集。
可以修改和更新记录,还可增加、删除记录,并将所做的变动反馈到该数据库中。
❑CRecordView类:提供了一个表单视图与某个记录集直接相连,利用对话框数据交换(DDX)机制在记录集与表单视图的控件之间传输数据。
❑CFieldExchange类:支持记录字段数据交换(DFX),即记录集字段数据成员与相应的数据库的标的字段之间的数据交换。
❑CDBException类:代表ODBC类产生的异常。
ADO技术简介ADO对象模型❑连接对象Connection❑通过连接可以从应用程序中访问数据源。
连接时必须指定要连接的数据源以及连接所使用的用户名和用户口令。
❑命令对象Command❑可以通过已建立的连接发出命令,从而对数据源进行指定操作。
一般情况下,命令可以在数据源中添加、修改或删除数据,也可以检索数据。
❑参数对象Parameter❑在执行命令时可以指定参数,参数可以在命令发布之前进行更改。
例如,可以重复发出相同的数据检索命令,但是每一次指定的检索条件不同。
❑记录集对象Recordset❑查询命令可以将查询结果储存在本地,这些数据以行为单位,返回数据的集合被称为记录集❑字段对象Field❑一个记录集包含一个或多个字段。
每一字段(列)都包含名称、数据类型和值属性。
❑错误对象Error❑错误可随时在程序中发生,通常是由于无法建立连接、执行命令或对某些状态的对象进行操作。
❑属性对象PropertyADO的4种类型的集合❑Connection对象具有Errors集合,包含为响应与数据源有关的单一错误而创建的所有Error对象。
❑Command对象具有Parameters集合,包含应用于Command对象的所有Parameter 对象。
❑Recordset对象具有Fields集合,包含Recordset对象中所有列的Field对象。
❑Connection对象、Command对象、Recordset对象和Field对象都具有Properties集合,它包含各个对象的Property对象。
使用ADO创建数据库应用程序❑在MFC应用程序中使用ADO数据库的一般过程是:❑添加对ADO的支持;❑创建一个数据源连接;❑对数据源中的数据库进行操作;❑关闭数据源。
引入ADO库❑在Visual C++中,使用ADO开发数据库之前需要引入ADO库。
可以在StdAfx.h 文件末尾处引入ADO库文件❑#endif // _AFX_NO_AFXCMN_SUPPORT❑#include <afxcmn.h> // MFC support for Windows CommonControls❑#import "C:\Program Files\CommonFiles\System\ADO\msado15.dll" \no_namespace rename("EOF", "adoEOF")❑#include <icrsint.h>❑//{{AFX_INSERT_LOCATION}}❑预编译命令#import是编译器将此命令中所指定的动态链接库文件引入到程序中,并从动态链接库文件中抽取出其中的对象和类的信息。
❑icrsint.h文件包含了Visual C++扩展的一些预处理指令、宏等的定义,用于与数据库数据绑定。
连接到数据库❑在能够使用ADO对象之前,必须为应用程序初始化COM环境❑BOOL CADOApp::InitInstance(){❑::CoInitialize(NULL);❑AfxEnableControlContainer();❑…}❑建立数据库的连接需要使用连接对象Connection。
首先定义一个_ConnectionPtr类型指针,然后调用CreateInstance方法实例化,例如:❑_ConnectionPtr m_pConnection;❑m_pConnection.CreateInstance(__uuidof(Connection));❑ADO使用Connection对象来建立与数据库服务器的连接,它相当于MFC中的CDatabase类。
和CDatabase类一样,调用Connection对象的Open即可建立与服务器的连接❑函数原型:HRESULT Connection::Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )❑参数:ConnectionString为连接字串,UserID是用户名,Password 是登录密码,Options是选项,通常用于设置同步和异步等方式。
_bstr_t是一个COM类,用于字符串BSTR(用于Automation的宽字符)操作。
❑不同的数据,其连接字串有所不同:Connection对象❑Connection对象除了建立与数据库服务器的连接外,还可以通过OpenSchema 来获取数据源的自有信息,如:数据表信息、表字段信息以及所支持的数据类型等。
❑OpenSchema方法中的adSchemaColumns是一个预定义的枚举常量,用来获取与“列”(字段)相关的信息记录集。
该信息记录集的主要字段名有“TABLE_NAME”、“COLUMN_NAME”;类似的,若在OpenSchema方法中指定adSchemaTables枚举常量,则返回的记录集的字段名主要有“TABLE_NAME”、“TABLE_TYPE”。
Recordset对象❑上述的OpenSchema函数返回的是记录集指针_RecordsetPtr,对应类型Recordset对象❑_RecordsetPtr指针与数据库是的游标类似,可以遍历一到多个记录集,常用指针指向操作有指向下一条记录MoveNext()、指向上一条记录MovePrevious()、指向第一条记录MoveFirst()、指向最后一条记录MoveLast()、指向下一个记录集NextRecordset()❑访问对应字段记录值用GetCollect ("字段名")或Fields->GetItem("字段名")->GetValue()Command对象❑Command对象专门用来操作数据库命令,如添加记录,删除记录,修改记录。
当然也可以用它来返回数据集,比如调用数据库中的存储过程,就可以返回一到多个记录集,在该过程中可能会用到Parameter参数对象❑此外,为了确保数据的一致性等要求,可能还会用到数据库事务处理,即连接对象的操作开始事务提交事务,回滚事务等操作执行SQL命令调用Recordset对象的Open方法_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。
_RecordsetPtr m_pRecordset;//初始化Recordset指针m_pRecordset.CreateInstance(__uuidof(Recordset));HRESULT rr=m_pRecordset->Open(“SELECT *FROMtable_mode”,m_pConnection.GetInterfacePtr,adOpenDynamic,adLockOptimistic,a dCmdText);读取表内数据如果没有遇到表结束标志adoEOF,则用GetCollect ("字段名")或m_pRecordset->Fields->GetItem("字段名")->Value方法,来获取当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。
关闭记录集直接用Close方法关闭记录集并赋予其空值m_pRecordset->Close();m_pRecordset=NULL;关闭一个库连接如果连接状态有效,则用Close方法关闭记录集并赋予其空值If(m_pConnection->State){m_pConnection->Close();m_pConnection=NULL;}Cnnection对象的Execute方法说明如下:Execute(_bstr_t CommandText,VARIANT * RecordsAffected,long Options) 其中CommandText是命令字符串,通常是SQL命令参数RecordsAffected是操作完成后所影响的行数参数Options表示CommandText的类型。