摘 要:本文介绍了微软推出的以ActiveX技术为基础的ADO数据存取技术,分析了ADO的工作原理,并用Visual C++说明了ADO数据访问技术的实现方法。
关键字:ADO;连接对象;OLE DB;数据存取;记录集
ADO(ActiveX Date Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术。ADO 技术基于COM(Component Object Model),具有COM组件的诸多优点,可以用来构造可复用应用框架,被多种语言支持,能够访问包括关系数据库、非关系数据库及所有的文件系统。另 外,ADO还支持各种客户/服务器模块与基于Web的应用程序,具有远程数据服务RDS(Remote Data Service)的特性,是远程数据存取的发展方向。
1 ADO的工作原理
ADO 封装了OLE DB所提供的接口,是基于OLE DB模型之上的更高层应用,比起OLE DB提供者,ADO的接口可以使程序员在更高级别上同数据交互,并且保留了MFC/ODBC和DAO的特性。ADO技术不仅可以应用于关系数据库,也可以 应用于非关系数据库。可以用统一的方法对不同的文件系统进行访问,大大简化了程序编制,增加了程序的可移植性。
1.1 ADO的对象
ADO接口是基于对象集合的,通常比OLE DB对象使用简单。ADO对象不依靠对象层次,大多数情况下,可以简单地创建并只使用需要处理的对象,而不必担心创建许多其他的“父”对象。
1.2 ADO编程模型[3]
ADO中的编程模型一般由一个动作序列组成。ADO提供了一组类,可以简化在C++代码中建立这种序列的处理。
1)接到一个数据源。
2)定对该数据源的一个查询。
3)执行该查询。
4)把查询数据检索到一个能够在C++代码中很容易访问的对象中。
5)如果需要,则更新该数据源,以反映对该数据的编辑。
6)提供检测错误的一般方法。
一般来说,我们需要使用上面提到的ADO编程模型中的所有步骤。但是ADO具有很大的灵活性,根据需要也可以只使用模型中的一部分。例如,我们可以创建一个新的记录集对象,并在代码中为其赋值,不必连接到某个数据源,也不必执行任何查询语句,甚至还可以把记录集对象传送给其它过程或应用程序。
2 用Visual C++开发ADO应用程序
使用Visual C++6.0为开发ADO应用程序而提供的动态链接库来开发数据库应用程序,可以灵活地控制应用程序。在进行ADO编程之前我们先建立一个Access数据库MyProject.mdb。
Visual C++中ADO编程的基本步骤和具体方法。
1)生成应用程序框架并初始化OLE/COM库环境
我们可以使用AfxOleInit()来初始化OLE/COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,代码如下:
BOOL CADOTestInstance() { AfxOleInit();…}
2)引入ADO库文件
Visual C++中通过在程序中使用预编译指令#import来告诉编译器将此指令中指定的动态链接库引入工程中,并从动态链接库中取出其中的对象和信息,产生msado15.tlh和ado15.tli两个头文件来定义ADO库。
在stdafx.h中加入如下语句:
#import
"c:/program files/common files/system/ado/msado15.dll"
no_namespace
rename("EOF","adoEOF")
程序的第三行指示ADO
对象不使用名称空间。在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。如果要使用名称空间,则
可把第三行程序修改为:
rename_namespace("AdoNS")。第四行代码将ADO中的EOF(文件结束)更名为adoEOF,以避免与定义了自己的EOF的其他
库冲突。
值得注意的是您的环境中msado15.dll不一定在这个目录下,请按实际情况修改。另外,在编译的时候可能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。
msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
3)创建ADO与数据源的连接
ADO与数据源的连接是通过连接智能指针来创建的。
首先我们需要添加一个指向Connection对象的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open()函数来创建与数据源的连接。
创建ADO的连接,首先要设置ADO连接对象的ConnectionString属性,该属性提供所要连接的数据库类型、数据所处服务器、要访问的数据库和数据库访问的安全认证信息。比较专业的方法是在ConnectionString中直接提供以上信息。其大致过程如下:
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
m-pConnection->Open ("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=MyProject.mdb","","",adModeUnknown);//连接数据库
在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的,下面是该方法的原型:
HRESULT Connection15::Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )
其中,ConnectionString为连接字串,UserID是用户名, Password是登陆密码。
可以看出上述的连接属性设置标准随着数据源的类型不同而变化,软件用户常常不习惯这种设置方式,都希望有可视化的数据源设置方法。为此Microsoft 提供了通用数据连接文件(.UDL)来建立和测试ADO连接属性,可以和ODBC一样可视化地定义要连接的数据源,从而实现数据访问的透明性。ADO连接 对象可以很方便地使用UDL文件来连接数据源,下面的例子使用mydata.udl来创建ADO连接。
_ConnectionPtr m_pDBConnect;
m_pDBConnect.CreateInstance(__uuidof(Connection));
m_pDBConnect->ConnectionString ="File Name=c:/mydir/mydata.udl";
m_pDBConnect->Open("","","",NULL);
这样一来无论数据源如何变化,在软件中都可以用统一的方法编程。当数据源改变时,只要双击相应的udl文件即可可视化地设置数据源,无需更改软件。
在你所想创建UDL 文件的目录中单击右键,选择新建|Microsoft 数据连接,然后将新创建的UDL文件更改为你所希望的文件名(.UDL扩展名不能改变)。如果操作系统是Windows 2000,先创建一个文本文件,再将该文本文件的扩展名改为 "udl",然后双击所创建的UDL文件,即可视化地完成数据源的设定。
4)执行SQL命令并取得结果记录集
为了取得结果记录集,我们定义一个指向Recordset对象的指针,并为其创建Recordset对象的实例:
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
在ADO中,可以有两种不同的方法执行命令,第一种是调用连接对象的Execute()函数,第二种是使用命令对象,这种方法可以用于更复杂的命令处理和使用参数化命令,下面我们逐一进行阐述。
① 利用Connection对象的Execute方法执行SQL命令
Execute方法的原型如下所示:
_RecordsetPtr Connection15::Execute ( _bstr_t CommandText, VARIANT * RecordsAffected, long Options )
其中,CommandText是命令字串,通常是SQL命令。参数RecordsAffected是操作完成后所影响的行数, 参数Options表示CommandText中内容的类型,Options可以取如下值之一:
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一个表名
adCmdProc:表明CommandText是一个存储过程
adCmdUnknown:未知
Execute执行完后返回一个指向记录集的指针。
下面以一个执行SQL以建立一张学生信息的表的例子说明如下:
_variant_t RecordsAffected;
m_pConnection->Execute("CREATE TABLE myTable(StuID INTEGER,StuName TEXT,Old INTEGER,Birthday DATETIME)",&RecordsAffected,adCmdText);
② 利用Command对象来执行SQL命令
当要执行复杂的命令以及执行带参数的命令时,要使用命令对象对数据源进行操作,这需要创建命令对象并使用命令对象所提供的函数。具体过程如以下代码所示:
_CommandPtr m_pCommand;
m_pCommand.CreateInstance("ADODB.Command"); //创建一个命令对象
m_pCommand->ActiveConnection = m_pConnection;
//将建立的连接赋值给它
m_pCommand->CommandText = "SELECT * FROM myTable";
//指定要执行的SQL命令字符串
m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
//执行命令,取得记录集
5)记录集的遍历、更新
ADO提供了在记录集中增加、删除和移动记录的方法,用这些方法可以很方便地遍历和更新记录集。这些方法的使用跟MFC数据库类的方法类似,这里就不再一一说明。
6)关闭记录集与连接
记录集或连接都可以用Close方法来关闭。
m_pRecordset->Close();//关闭记录集
m_pConnection->Close();//关闭连接
读到此处相信读者已经熟悉ADO操作数据库的大致流程了,最后值得指出的是因为ADO是COM接口,为了软件的可靠性,在打开ADO连接时,应该加入异常处理代码。
3 结束语
ADO技术具有易于使用、访问灵活、对磁盘和存储容量要求小、应用范围广等特点,其优越性已经在笔者用Visual C++6.0开发的电力系统接线图动态配置软件中得到了很好的体现。了解和掌握ADO技术具有深远的意义。