微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。
ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据。例如,如果您希望编写应用程序从DB2或Oracle数据库中向网页提供数据,可以将ADO程序包括在作为活动服务器页(ASP)的HTML文件中。当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO代码的结果。 象Microsoft的其它系统接口一样,ADO是面向对象的。它是Microsoft全局数据访问(UDA)的一部分,Microsoft认为与其自己创建一个数据,不如利用UDA访问已有的数据库。为达到这一目的,Microsoft和其它数据库公司在它们的数据库和Microsoft的OLE数据库之间提供了一个“桥”程序,OLE数据库已经在使用ADO技术。ADO的一个特征(称为远程数据服务)支持网页中的数据相关的ActiveX控件和有效的客户端缓冲。
ADO从原来的Microsoft数据接口远程数据对象(RDO)而来。RDO与ODBC一起工作访问关系数据库,但不能访问如ISAM和VSAM的非关系数据库。
ADO 是对当前微软所支持的数据库进行操作的最有效和最简单直接的方法,它是一种功能强大的数据访问编程模式
ADO(ActiveX Data Objects)是基于组件的数据库编程接口,它是一个和编程语言无关的COM组件系统。本文主要介绍用ADO编程所需要注意的技巧和在VC下进行ADO 编程的模式,并对C++Extensions进行了简单的讨论,希望对ADO开发人员有一定的帮助作用。因为ADO是一个和编程语言无关的COM组件系统,所以这里讨论的要点适用于所有的编程语言和编程环境,比如:VB、VBScript、VC、Java等等。
1.下面介绍如何使用ADO连接ACCESS数据库.在连接数据库时,需要使用Connection对象的Open方法打开与数据源的连接.
语法:Connectoin.open Connectionstring,userID,password,openoptions Open方法的参数表说明如下 Open方法参数说明 ConnectionString (可选)字符串,包含连接信息,参照(ConnectionSting)属性可获得有效调协的详细信息 UserID (可选)字符串,包含建立连接时所使用的用户名称 Password (可选)字符串,包含建立连接时所用的密码 openoptions (可选)ConnectionEnum值.如果调协为adConnectoAsync,则异步打开连接,当连接可用时将产生ConnectComplete事件
增加路径C:\program files\common files\system\ado,设置包含ADO类型库的路径。
从View菜单中,激活ClassWizard,点击Add Class按钮并选择“From A Type Library...”选项,然后在Type Library dialog box对话框中,从C:\program files\common files\system\ado中选择文件msado15.dll,在Confirm Classes对话框中,选择所有列出的类并按OK按钮退出ClassWizard。这样,ClassWizard便生成了两个文件msado15.h和 msado15.cpp。
下面是实现ADO应用的示例代码: //初始化COM对象 AfxOleInit(); ... //定义数据集对象 _Recordset Rs1; COleException e; COleVariant Connect( “DSN=AdoDemo;UID=sa;PWD=;” ); COleVariant Source ( “SELECT * FROM Authors” ); //创建数据集对象 Rs1.CreateDispatch(“ADODB.Recordset.2.0”,&e ); Rs1.Open( (VARIANT) Source, (VARIANT) Connect, 0, 1, -1 ); //此处可以添加对结果集Rs1进行处理的代码 Rs1.Close(); Rs1.ReleaseDispatch(); AfxMessageBox(“Success!”);
对于VC下的基于ADO的数据库开发就稍微复杂一些。
VC中实现对ADO操作通常有三种方法:
?#import方法;
?利用MFC OLE的ClassWizard;
?通过Windows API中COM相关的函数。
在这三种方法中,
#import是最方便的方法,它允许产生一个类似VB的类结构,使程序开发变得很方便。下面分别介绍这三种方法。
1.#import方法 在#import方法中,需要提供所要包含的类型库的路径和名称,VC能够自动产生一个对GUIDs的定义,以及自动生成对ADO对象的封装。对任何引用的类型库,VC会在编译的时候自动生成两个文件:
?头文件(.tlh):包含了所列举的类型和对类型库中对象的定义;
?实现文件(.tli):对类型库对象模型中的方法产生封装。 例如,在stdafx.h文件中增加对msado15.dd的
#import之后,VC会产生msado15.tlh和msado15.tli两个文件。
#import能够使用一个新的类_com_ptr_t,它也被称为智能指针。智能指针能够自动执行QuyerInterface、AddRef和Release函数。
下面的代码演示了如何使用#import在应用中实现对ADO的操作:
#import “c:\program files\common files\system\ado\msado15.dll” \no_namespace
rename ( “EOF”, “adoEOF” )
重命名EOF是必要的,因为典型的VC应用都已经定义了EOF作为常数-1。
通常来说,操作一个自动化对象需要定义和初始化一个用来操作的变量。可以通过使用智能指针 (_com_ptr_t)的构造函数传递一个有效的CLSID或者是PROGID,也可以通过_com_ptr_t::CreateInstance()方法来定义对象。
具体代码如下所示:
_ConnectionPtr Conn1( __uuidof( Connection ) );
也可以采用下面的代码实现同样的功能:
_ConnectionPtr Conn1 = NULL; //定义对象
HRESULT hr = S_OK; //创建实例
hr =Conn1.CreateInstance( __uuidof( Connection ) );
推荐采用第二种方式,因为用第一种方式不能返回一个失败的HRESULT,所以也就不能判断ADO连接对象是成功还是失败,以及失败的原因。注意这里的__uuidof( Connection)中的Connection是在.tlh文件中定义的。通过把它传递给方法CreateInstance,就可以创建一个有效的 ADOConnection对象。
需要注意的是#import的no_namespace属性,它告诉编译器该类在不在一个单独的名字空间中。
使用no_namespace意味着不需要在初始化变量时引用名字空间。
当然如果在应用中需要导入多个类型库时,最好不要使用 no_namespace,以免引起名字冲突。
下面是一个简单的采用了#import方法的基于ADO应用的示例代码:
#include
#import rename(“EOF”, “adoEOF”)
void main()
{ HRESULT hr = S_OK; //因为没有在#import中指定no_namespace,所以必须采用ADODB::这样的形式来定义变量类型
ADODB::_RecordsetPtr Rs1 = NULL; //通过ODBC建立ADO连接
_bstr_t Connect( “DSN=AdoDemo;UID=sa;PWD=;” );
_bstr_t Source ( “SELECT * FROM Authors” );
CoInitialize(); //初始化Rs1对象
hr = Rs1.CreateInstance( __uuidof( ADODB::Recordset ) ); //省略对返回值hr的判断
Rs1->Open( Source, Aonnect,
ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, -1 ); //此处可以添加对记录集Rs1进行操作的代码
Rs1->Close();
Rs1 = NULL;
::MessageBox( NULL,“Success!”,“”,MB_OK ); CoUninitialize(); }