在介绍ADO编程编程之前,对数据库访问技术做一个简要回顾。
一、数据库访问技术
1. ODBC(Open Database Connectivity),开放数据库互连
ODBC是上个世纪八十年代末九十年代初出现的技术,它为编写关系数据库的客户软件提供了一种统一的接口。ODBC提供一个单一的API,可用于处理不同数据库的客户应用程序。使用ODBC API的应用程序可以与任何具有ODBC驱动程序的关系数据库进行通信。ODBC体系架构如图1所示
图1 ODBC体系架构
1. DAO(Data Access Object),数据访问对象
DAO就是一组Microsoft Access/Jet数据库引擎的COM自动化接口。 DAO不像ODBC那样是面向C/C++程序员的,它是微软提供给Visual Basic开发人员的一种简单的数据访问方法,用于操纵Access数据库。
2. RDO(Remote Data Object),远程数据对象
由于RDO直接调用ODBC API(而不是像DAO那样通过Jet引擎),所以,可以为使用关系数据库的应用程序提供更好的性能。
3. OLE DB,对象链接与嵌入数据库
OLE DB在两个方面对ODBC进行了扩展。首先, OLE DB提供了一个数据库编程的COM接口;第二, OLE DB提供了一个可用于关系型和非关系型数据源的接口。 OLE DB的两个基本结构是OLE DB提供程序(Provider)和OLE DB用户程序(Consumer)。OLE DB体系结构如图2所示
1. ADO(ActiveX Data Object),ActiveX数据对象
ADO建立在OLE DB之上,因此访问数据库的灵活性增强了,但是效率会相应有所减慢。ADO是一个OLE DB用户程序。使用ADO的应用程序都要间接地使用OLE DB。ADO简化了OLE DB,提供了对自动化的支持,使得像VBScript这样的脚本语言也能够使用ADO访问数据库。
二、ADO编程基础
ADO(ActiveX Data Object,AxtiveX数据对象)是Microsoft 数据库应用程序开发的新接口,是目前在Windows环境中比较流行的客户端数据库编程技术。同时,ADO还是建立在OLE DB底层技术之上的高层数据库访问技术。OLE DB是数据库底层接口,为各种数据源提供了高性能的访问;而ADO则封装了OLE DB所提供的接口,使用户能够编写应用程序以通过OLE DB提供访问和操作数据库服务器中的数据。
ADO的优点在于使用简便、速度快、内存支出少,磁盘遗迹小,同时还具有远程数据服务功能,可以在一次往返过程中实现将数据服务从服务器移动到客户端程序,然后在客户端对数据进行处理并将更新结果返回到服务器。此外,ADO还提供了多种语言支持,除了面向Visual C++外,还提供了面向其他各种开发工具的应用。
ADO对象
ADO主要有三个对象:
1.Connection对象 ADO连接对象,用于连接数据源,并处理一些事物和命令。在使用ADO操作(访问)数据库前,必须首先创建一个ADO连接对象,然后才能通过该对象打开到数据库的连接。
2.Command对象 ADO命令对象,用于执行传递给数据源的命令,主要用于查询数据库,并返回Recordset对象中的记录,以便大量操作,或对数据库结构进行操行。
3.Recordset对象 ADO记录集对象,表示基本表,或者表示命令执行结果的记录全集。需要注意的是,Recordset对象的当前记录是集合中的单个记录。采用ADO时,可以使用Recordset对象操作来自提供者(数据源)的数据,也可以使用Recordset对象对数据库中的所有数据进行操作。结构上,所有的Recordset对象均由记录(行)和字段(列)组成。
其他四个对象:
4.Parameter对象 ADO参数对象,代表参数或基于参数化的命令对象的参数信息。主要进行的操作在这些命令中只定义一次,但可以使用参数来改变命令的细节。
5.Field对象 每个Field对象都对应Recordset中的一列。使用Field对象的Value属性可以设置或返回当前记录的数据。
6.Error对象 ADO错误对象
7.Property对象 ADO属性对象
ADO接口简介
ADO技术是基于OLE DB的访问接口,而后者又是基于COM接口的技术,对于这种特殊的关系,MFC并没有提供对ADO操作的支持类,但是通过一些特殊的ADO支持类可以很方便地使用ADO对象,_com_ptr_t就是其中的中一个。
ADO库中包含的三个基本接口为_ConnectionPtr接口,_CommandPtr接口和_RecordsetPtr接口,接下来对它们分别加以简要介绍。
1._ConnectionPtr接口
该接口返回一个记录集或一个空指针。通常用它来创建一个数据连接,或执行一条不返回任何结果的SQL语句,如一个存储过程。不推荐使用_ConnectionPtr接口返回一个记录集,对于要返回记录的操作通常用_RecordsetPtr来实现,而且使用_ConnectionPtr时要想得到记录数目必须遍历所有记录,但使用_RecordsetPtr。
2. _CommandPtr接口
该接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串.如果只执行一次或几次数据访问操作,后者是比较好的选择.但如果要频繁访问数据库,并要返回很多记录集,那么应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句.
3._RecordsetPtr接口
该接口是一个记录集对象.与前面两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等.同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接.如果要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句.
示例:
1) 创建记录集
_RecordsetPtr [name]
2) 打开记录集
[name]->Open(_variant_t("表名"),
_variant_t((IDispatch *)m_pConnection,true), adOpenKeyset,
adLockOptimistic, adCmdTable);
3) 遍历记录集
Move 将记录集指针移动到指定的记录
MoveFirst 将记录集指针移动到第一条记录
MoveLast 将记录集指针移动到最后一条记录
MoveNext 将记录集指针移动到下一条记录
MovePrev 将记录集指针移动到前一条记录
4) 访问记录集
有三种方法获得字段值
a.[name]->GetItem(index)->Value
[name]->GetItem(index)->Value
b. [name]->GetField()->GetItem(index)->Value
[name]->GetField()->Item (index)->Value
c.[name]-> GetCollect(字段名)
***index和取得的值都是_variant_t,必须经过类型转换,转换成我们需要的类型
d.设置字段值
[name]->PutCollect(字段名,新值)
待完善