在本章的第一部分中,将简要介绍OLE DB,包括OLE DB的体系结构以及OLE DB和ADO之间的关系。第二部分将说明基本的ADO数据库编程技术,以及如何用这种技术创建SQL Server数据库应用程序。
本章主要介绍下列内容:
n OLE DB和ADO的概念
n OLE DB的体系结构
n OLE DB和ADO之间的关系
n 基本的ADO数据库编程技术
n 用OLE DB和ADO创建SQL Server数据库应用程序
OLE DB是由Microsoft最新开发的数据访问编程界面。Microsoft已经把OLE DB定位成ODBC API的继承者。由于ODBC的广泛应用,用OLE DB替代ODBC还有许多事情要做。ODBC API已被广泛接受,除了为数千种定制的数据库应用程序提供数据库支持外,大多数桌面应用程序,例如Microsoft office,都支持ODBC API。ODBC驱动程序存在于所有主要的数据库系统中。然而,ODBC主要用于处理关系型数据库。ODBC是基于SQL的,它可以很好地用于关系型数据库访问,但不能用于非关系型数据源。与ODBC一样,OLE DB也提供了对关系型数据的访问,而且还扩展了由ODBC提供的功能。
OLE DB的设计目标是用于所有数据类型的标准界面。除了对关系型数据的访问外,OLE DB还提供了对各种数据源的访问,包括像Excel电子表格数据、像dBase的ISAM文件、电子邮件、新的NT与Active Directory和IBM的DB2数据。通过OLE DB,用一个界面就可以访问许多不同的数据源。
正如其名称所示,OLE DB是在OLE基础上创建的。ODBC提供了一种DLL调层界面,而ADO为OLE DB提供了COM界面,允许从其他与OLE兼容的应用程序调用。OLE是Microsft的数据访问策略,是万能数据访问的基础。万能数据访问是一组通用界面,它用来表示任何数据源中的数据。OLE DB技术使万能数据访问成为现实。万能数据访问和OLE DB的另一端上所有的对象都应在数据库中维护。OLE DB并不是把商务需要的不同数据移动到一个面向对象的数据库中,而是创建并理解商务数据,并在各个数据源中维护。OLE DB提供了用于各种数据的类似界面。OLE DB可以用来访问任何可以用基本的行和列格式表示的数据。
使用OLE DB的应用程序一般分为OLE DB提供者或者OLE DB使用者。OLE DB使用者是用OLE DB界面写成的应用程序。相比较而言,OLE DB提供者负责访问数据源,并且通过OLE DB界面向OLE使用者提供数据。一般有两种OLE DB提供者:数据提供者和服务提供者。数据提供者只是从数据源中提取数据,而服务提供者则传输和处理数据。服务提供者一般提供比较高级的函数,来扩展OLE DB数据提供者的基本数据访问功能。例如,Microsoft Query是一个OLE DB服务提供者,而SQL Server的Microsoft OLE DB提供者是一个OLE DB数据提供者的样例。
OLE DB根据各种OLE DB提供者的功能,提供了不同等级的功能模块。全新OLE DB驱动程序支持一个通用界面,每一个驱动程序都可以扩展OLE DB功能。与ODBC非常类似,每一个不同的OLE DB数据源都使用自己的OLE DB提供者。例如,可以使用Microsoft的SQL Server OLE DB提供者访问SQL Server数据库,也可以用它们各自的OLE DB提供者访问包含在Microsoft Excel或者Exchange中的数据。为了最大限度地兼容已有的ODBC源,Microsoft开发了ODBC的OLE DB提供者MSDASQL。大多数的OLE DB提供者提供了直接的数据库访问,而MSDASQL OLE DB provider for ODBC可使用已有的ODBC驱动程序访问数据。MSDASQL OLE DB provider for ODBC将OLE DB调用映射为与之等价的ODBC调用。由这个OLE DB provider for ODBC提供的功能依赖于基本的ODBC驱动程序。
每一个OLE DB提供者通过其COM传送数据,并显示其功能。然而,OLE DB的COM界面是一种行级界面,要求支持指针、数据结构和直接内存分配。因此,直接使用OLE DB提供者不适合于不支持行级指针的开发环境,例如Visual Basic、VBA、VBScript、Java、Java Script和其他几种语言。但它适合于ADO,ADO允许通过交互式操作方式和脚本语言访问OLE DB提供者,这些脚本语言支持数据访问,但是不支持行级内存的访问和操纵。
ADO是一个OLE DB使用者,它提供了对OLE DB数据源的应用程序级访问。ADO是一个OLE Automation服务器,大多数与OLE兼容的开发和脚本环境都可以访问它。可以从下面的Microsoft Web站点下载ADO:
http://www.microsoft.com/data/ado/download/htm.
ADO还可作为许多不同的Microsoft开发产品的标准组成部分提供,这些产品包括:
n Visual Studio Enterprise Edition 5和6
n Visual Basic Enterprise Edition 4、5和6
n SQL Server 7、SQL Server2000
为了访问SQL Server数据,OLE DB提供了两种不同的方法:OLE DB for SQL Server provider和OLE DB provider for ODBC。ADO可以使用这两个OLE DB提供者。另外,ADO可通过多层体系结构来使用ADO对象框架。
Visual Basic应用程序可创建和使用各种ADO对象,而ADO对象框架调用相应的OLE DB提供者。如果ADO应用程序正在使用OLE DB provider for ODBC,就将使用MSDASQL OLE DB provider。当使用OLE DB provider for ODBC时,ADO将加载文件msdas.dll,该文件再加载ODBC Driver Manager。OLE DB provider for ODBC将ADO产生的OLE DB呼叫映射为ODBC呼叫,然后将ODBC呼叫传送给ODBC Driver Manager。
ODBC Driver Manager负责加载相应的ODBC驱动程序。ODBC驱动程序一般使用网络进程通信(IPC)方法,例如Named Pipes、TCP/IP Sockets或者SPX,与访问目标数据源的远程IPC服务器通信。本地的OLE DB provider for SQL Server不使用任何附加的中间层。当使用OLE DB provider for SQL Server时,ADO加载spldedb.dll文件,该文件直接使用与库通信的相应的网络IPC方法。IPC客户机组件通过正在使用的网络协议创建与相应的服务器IPC数据流的连接,常用的网络协议包括Net BEUI、TCP/IP和IPX。在这个层次结构的底部是物理网络拓扑结构。物理网络包括适配器卡和用于连接联网系统的缆线。Ethernet和Token Ring是两种最常用的网络拓扑结构。
表21-1列出了用于实现ADO的客户机文件。
表21-1 实现ADO的客户机文件
|
文 件 |
描 述 |
|
msdasp.dll |
OLE DB provider for ODBC |
|
sploledb.all |
OLE DB provider for SQL Server |
|
msadol5.dll |
|
与其他几个数据访问对象模型一样,ADO也是用层次对象框架实现的。然而,ADO对象模型比Data Access Objects(DAO)或者Remote DAtabase Objects(RDO)框架更简单。
在ADO对象模型中,Connection、Recordset和Command对象是3个主要的对象。Connection对象表示对远程数据源的连接,除了创建对数据源的连接之外,Connection对象还可以用来控制事务范围。Connection对象与Recordset对象或者Command对象关联。
Recordset对象表示从数据源返回的结果集。ADO Recordset对象既可以使用一个打开的Connection对象,也可以创建对目标数据源的连接。Recordset对象允许查询和修改数据。
Command对象可用来执行命令和带参数的SQL语句,Command对象可以用于SQL语句和返回结果集的SQL查询。与ADO Recordset一样,Command对象既可以使用一个活动的Connection对象,也可以创建对目标数据源的连接。Command对象包含一个Parameters集合,这个集合中的每一个Parameter对象表示Command对象使用的一个参数。当Command对象执行一个带参数的SQL语句时,每一个Parameter对象表示SQL语句中的一个参数。
在Connection对象的下面是Errors集合。在Errors集合中,每一个Error对象包含了一个错误信息,该错误是由ADO对象框架中的一个对象产生的。
除了上面介绍的主要对象之外,Connection、Command、Recordset和Field对象都是有一个Properties集合,它由一组Property对象组成。每一个Property对象都可以用于获取或者设置与对象相关的各种属性。
用户在刚开始看到的ADO对象框架时,会觉得其层次结构与DAO和RDO相同,其实不然。所有的ADO对象(除了Errors、Fields和Properties对象外)都可以创建在自己身上,不需要访问更高一层的对象,这使ADO对象框架非常简单,并且比其他对象模型更灵活。例如,ADO对象框架允许打开一个Recordset对象,而不必先建立一个Connection对象实例。直接使用每一个对象而不必首先调用更高层的对象的能力,使ADO比其他对象框架更容易使用。然而,ADO并非总是像使用其他框架一样简单明了。
ADO是作为一个OLE Automation服务器创建的,这就便于从Visual Basic中访问ADO函数。在使用ODBC或者其他基于LL的API时,必须在.bas或者cls模块中手工声明函数和参数,而使用ADO时,只需在项目中增加ADO参考,这些将在下一节解释。当在Visual Basic开发环境中增加ADO参考之后,就可以使用所有的ADO对象。在Visual Basic中使用ADO所需的步骤如下:
(1)在Visual Basic的Microsoft ADO 2.1对象库中,制作一个参考。
(2)用Connection、Command或者Recordset对象打开一个连接。
(3)用Command或者Recordset对象访问数据。
(4)关闭到Connection、Command或者Recordset对象的连接。
在Visual Basic中使用ADO之前,必须设置对ADO类型库(也称为ADO Automation服务器)的参考,以提供支持ADO 2.1的基本文件。当第一次从Microsoft Web站点下载ADO支持文件时,或者当安装了前面列出的某个包含ADO的产品时,会将ADO自动安装在系统上。然而,在Visual Basic项目中使用ADO之前,需要在Visual Basic的开发环境中设置对ADO OLE类型库的参考。
为了在Vissual Basic 5、6中增加对ADO Objects 2.1 Library的参考,启动Visual Basic,然后选择Projects References,则显示References对话框。
在References对话框中,滚动Available References列表,直到看到Microsoft ActiveX Data Objects 2.1 Library选项为止。单击这个复选框,然后单击OK按钮,就将ADO Objects Library增加到Visual Basic的IDE中,但这个操作并不会在Visual Basic的Toolbox中创建任何可视的对象。
为了看到ADO对象的属性和方法,需要使用Visual Basic的Object browser。
在Visual Basic开发环境中增加了对ADO2.1 Library的参考之后,就可以用ADO创建Visual Basic应用程序。与DAO或者RDO对象模型不同,ADO在创建对数据源的连接之前不必创建顶层对象。使用ADO时,应用程序执行的第一步操作是使用Connection、Command或者Recordset对象打开一个连接。
通过使用MSDASQL OLE DB provider for ODBC或者OLE DB provider for SQL Server,ADO可以连接到SQL Server。MSDASQL provider允许ADO对象框架使用已有的ODBC驱动程序,而OLE DB provider可直接连接到SQL Server。这两个OLE DB provider都可以用于ADO Connection、Command和Recordset对象。在下一节中,将研究如何使用OLE DB provider for ODBC和OLE DB provider for SQL Server创建一个到SQL Server的连接、如何使用ADO Connection对象以及如何直接通过ADO Resultset对象连接到SQL Server上。
如果熟悉DAO或者RDO对象框架,在开始创建应用程序时,最好使用ADO Connection对象和OLE DB provider for ODBC创建一个对SQL Server系统的连接。与DAO和RDO一样,MSDASQL OLE DB provider for ODBC用一个ODBC驱动程序和一个在ODBC Administrator中用于SQL Server的Data Source Name(DSN),或必须使用一个无DSN的连接字符串。
程序清单21-1说明如何使用ADO Connection对象和MSDASQL provider提示用户选择一个将用于连接SQL Server的DSN。
程序清单21-1:使用ADO Connection对象
Dim cn As New ADODB.Connection
'DSN Connection using the OLE DB provider for ODBC-MSDASQL
cn.ConnectionString="DSN="&_
";database=OYBSLyud="& sLonginID_
";PWD="& sPassword
'prompt the user to select the DSN
cn.Properties("Prompt")=adPromptComplete
cn.Open
cn.Closes
在这个代码示例的开头,创建了一个ADO Connection对象的实例cn.。由于ADO对象不依赖上层对象,所以每一个对象必须有一个带有Visual Basic的New关键字的Dim语句。接下来,给Connection对象cn的ConnectionString属性赋予一个ODBC连接字符串。与通常的ODBC连接字符串一样,这个用在ADO的ConnectionString属性中的连接字符串必须包含一组预定义的关键字,其中每一个关键字和与其相关的值用分号隔开。因为ADO是基于OLE DB,而不是ODBC,所以连接字符串中使用的关键字与标准的ODBC连接字符串中使用的