【 tulaoshi.com - 编程语言 】
简介
ActiveXDataObjects(ADO)是微软最新的数据访问技术。它被设计用来同新的数据访问层OLEDBProvider一起协同工作,以提供通用数据访问(UniversalDataAccess)。OLEDB是一个低层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库,以及电子邮件系统及自定义的商业对象。
ADO向我们提供了一个熟悉的,高层的对OLEDB的Automation封装接口。对那些熟悉RDO的程序员来说,你可以把OLEDB比作是ODBC驱动程序。如同RDO对象是ODBC驱动程序接口一样,ADO对象是OLEDB的接口;如同不同的数据库系统需要它们自己的ODBC驱动程序一样,不同的数据源要求它们自己的OLEDB提供者(OLEDBprovider)。目前,虽然OLEDB提供者比较少,但微软正积极推广该技术,并打算用OLEDB取代ODBC。
ADO向VB程序员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ADO2.0的Msado15.dll需要占用342K内存,比RDO的Msrdo20.dll的368K略小,大约是DAO3.5的Dao350.dll所占内存的60%)。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。因此你可以只创建一个"Connection"对象,但是可以有多个,独立的"Recordset"对象来使用它。ADO针对客户/服务器以及WEB应用程序作了优化。
本文的目的是带你进入ADO广阔的世界并开始使用它。
在哪里能得到ADO?
目前ADO1.5版已经可以从微软网站免费下载。到目前为止,微软网站仍是你获取有关ADO最新信息的最佳场所。ADO1.5是作为OLEDBSDK的一部分提供的。你可以从下面这个网址下载:
http://www.microsoft.com/data/oledb/download.htm
在下载之前请先确认OLEDBSDK提供的各项特性。下载文件大约有15M,如果完全安装的话要占用80M的硬盘空间。如果你只对ADO感举趣,就选择最小安装,这样只会占用你15M的硬盘空间。关于ADO的网页在:
http://www.microsoft.com/data/ado/adoinfo.htm.
在这里你可以找到许多关于ADO的示例代码和文章,尤其是在"Workshop"系列的文章中。你也可以从本站下载ADO2.5的帮助文件。
尽管OLEDBSDK提供自己的ADO帮助文件,你会发现ADO1.0的帮助文件更易于使用。同时它还向你提供ADO对象模型的图示
ADO是如何组织起来的?
以前的对象模型,如DAO和RDO是层次型的。也就是说一个较低的数据对象如Recordset是几个较高层次的对象,如Environment和QueryDef,的子对象。在创建一个QueryDef对象的实例之前,你不能创建DAORecordset对象的实例。但ADO却不同,它定义了一组平面型顶级对象.
最重要的三个ADO对象是Connection,Recordset和Command.本文将主要介绍Connection和Recordset这两个对象。每个Connection的属性定义了与数据源的连接。Recordset对象接收来自数据源的数据。Recordset可以与Connection一起起使用,先建立一个连接,然后获取数据。尽管如此,Recordset也可以被单独创建,其Connection参数可以在Open属性定义。
如何使用ADO?
一旦安装了ADO,在VB的工程-引用对话框中你就可以看到象下图所示的东西了:
选择"ActiveXDataObjects1.5Library"(ADODB).在其下的"ADORecordset1.5Library"是一个客户端的版本(ADOR),它定义了有聚的数据访问对象。ADOR对于客户端的数据访问来说是足够的了,因为你不需要Connection对象来建立与远程数据源的联系。
如果你想要访问更多的外部数据源,你需要安装这些外部数据源自己的OLEDBProvider,就象你需要为新的数据库系统安装新的ODBC驱动程序一样。如果该外部数据源没有自己的OLEDBProvider,你就得使用OLEDBSDK来自己为这个外部数据源创建一个OLEDBProvider了。这已不是本文讨论的范围了。
示例
下面的示例代码以Northwinds数据库作为远程数据源,然后用ADO来访问它。首先在控制面板中打开“32位数据源”,单击“添加”按钮。在弹出的对话框中选择"MicrosoftAccessDriver(*.mdb)"作为数据源驱动程序。
然后按下图所示,在对话框中填写下面的内容
选择数据库Northwinds所在路径。单击完成,退出ODBC设备管理器。
启动一个新的VB工程,在窗体的Load事件中输入下面的代码:
PrivateSubForm_Load()
DimcnAsADODB.Connection
Setcn=NewADODB.Connection
'SetConnectionproperties
cn.ConnectionString="DSN=RDCNwind;UID=;PWD=;"
cn.ConnectionTimeout=30
cn.Open
Ifcn.State=adStateOpenThen_
MsgBox"ConnectiontoNorthWindSuccessful!"
cn.Close
EndSub
按F5运行程序,看看,一个消息框弹出来告诉你连接成功了。请注意,这里我特别注明了是ADODB.Connection,而不是ADOR.Connection,这样做是为了将二者区分开(如果你引用了ADODB和ADOR的话,这样做很有必要)。连接字符串看上去同RDO的连接字符串差不多。事实上,二者确实差不多。
如果我们要访问一个SQLserver数据库,你的Connection代码看上去应象下面所示:
'设置连接属性cn.Provider="MSDASQL"
cn.ConnectionString="driver={SQLServer};"&"server=prod1;uid=bg;pwd=;database=main"
cn.Open
"Provider"属性指向SQLServer的OLEDBProvider.
回到我们的示例程序,让我们创建一个Recordset对象来访问“Orders”表,并从该表的"ShipCountry"字段中产生头十个不重复的国家名。修改窗体Load事件中的代码,让它看上去象下面这样。
PrivateSubForm_Load()
DimcnAsADODB.Connection
DimrsAsADODB.Recordset
DimsSQLAsString
DimsOutAsString
DimCountAsInteger
Setcn=NewADODB.Connection
Setrs=NewADODB.Recordset
'SetpropertiesoftheConnection.
cn.ConnectionString="DSN=RDCNwind;UID=;PWD=;"
cn.ConnectionTimeout=30
cn.Open
Ifcn.State=adStateOpenThen_
MsgBox"ConnectiontoNorthWindSuccessful!"
sSQL="SELECTDISTINCTOrders.ShipCountryFROMOrders"
Setrs=cn.Execute(sSQL)
'Enumeratetherecordset
sOut=""
ForCount=1To10
sOut=sOut&rs("ShipCountry")&vbCrLf
rs.MoveNext
NextCount
MsgBoxsOut,vbExclamation,"ADOResults"
cn.Close
EndSub
运行程序后,你会看到如下图所示的消息框。
不幸的是,目前这个Recrodset对象是只读的和forwardcursor。如果你想要获取更多的功能,你需要创建一个独立的Recordset对象,该对象拥有自己的Connection属性,就象下面的代码所示:
PrivateSubForm_Load()
DimrsAsADODB.Recordset
DimsSQLAsString
DimsOutAsString
DimCountAsInteger
Setrs=NewADODB.Recordset
sSQL="SELECTDISTINCTOrders.ShipCountryFROMOrders"
rs.OpensSQL,"DSN=RDCNwind;UID=;PWD=;",adOpenDynamic
'ReportRecordsetConnectioninformation
MsgBoxrs.ActiveConnection,,"ConnectionInfo"
'Enumeratetherecordset
sOut=""
ForCount=1To10
sOut=sOut&rs("ShipCountry")&vbCrLf
rs.MoveNext
NextCount
MsgBoxsOut,vbExclamation,"ADOResults"
rs.Close
EndSub
上面代码返回的结果同前例一样,但是本代码中的Recordset是独立的。这一点是DAO和RDO做不到的。Recordset对象的Open方法打开一个代表从SQL查询返回的记录的游标。虽然你可以用Connection对象同远程数据源建立连接,但请记住,在这种情况下,Connection对象和Recordset对象是平行的关系。
总结
本文仅向你介绍了ADO强大的功能的冰山一角。微软承诺,在将来ADO将会取代DAO和RDO。所以现在你应该考虑如何将你的数据访问代码投向ADO的怀抱。这种转变不会很痛苦,因为ADO的语法同现有的语法差不多。也许微软或第三方会在将来开发出转换向导来简化这一转换过程。从现在起,你就应开发纯ADO代码的程序。你也可以继续使用DAO或RDO代码来开发你的程序,但落伍的感觉总是不好的。->