锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

VC++ ADO开发实践之七 (转)

时间:2023-06-28 17:37:00 30ry7u电子继电器

VC ADO七种开发实践 (转)[@more@]一致的数据访问技术ADO/OLE db

microsoft新近推出的UDA(Universal Data Access,一致数据访
问技术)为关系型或非关系型数据访问提供一致的访问接口
级Intr .NET应用多层 提供数据接口标准的软件结构。一致数据访问包
分别为括两层软件接口ADO(Active Data object)和OLED B,对应于
不同层次的应用开发,ADO在各种脚本语言中提供高层软件接口(Sc
ript)或直接用于某些宏语言;OLE DB底层软件层提供软件接口C/C
直接用于语言。ADO以OL E DB为基础,它对OLE DB包装。
基于一致数据访问技术的一致数据访问技术Microsoft的COM( 组件 在对象模型的基础上,
包括一组COM组件 通过程序、组件、组件或客户程序
标准的COM通信接口。
由于ADO建立在自动化(Automation)所以ADO的应用场合
非常广泛,不仅可以 Visual Basic在这样的高级语言开发环境中使用也是如此
可用于一些脚本语言的开发 web应用,在 ASP(Active Serv
er Page)访问脚本代码 操作应用的捷径在数据库中提供。本文将是第一个
先介绍ADO和OLE DB读者可以理解结构模型ADO与OLE DB之间的关
系,然后介绍ADO对象模型和ADO同时,我们也会通过一些特征
向读者显示给读者ADO的用法。
一、一致数据访问介绍
随着 随着网络技术和数据库技术的不断发展,目前的应用 系统对数据
对集成的要求越来越高,这些数据可能分布在不同的地方,不能使用
相同的格式,如关系数据库和 操作系统中的 文件、电子表格、电子
邮件、多 媒体数据、目录服务信息等。传统的解决方案是大规模使用
类型的数据库系统将所有这些数据移动到数据库系统,然后根据操作
数据库可以以统一的方式访问这些数据,尽管它们可以以统一的方式访问
这种间接访问带来了很多问题,比如数据
新不及时、空间资源冗余和访问 低效等等。
Microsoft公司推出的一致数据访问技术更好地解决了这些问题
它使应用程序能够通过一致的接口访问各种数据,而不管数据是否驻扎
在实现分布式的同时,无需进行数据转移、复制和转换
它还带来了高效率。而且也带来了高效率。UDA在统一数据访问接口的同时,该技术是多层的
结构给了数据用户更多的选择,其强大的扩展能力也给了数字
根据供应商留下的扩展空间,这种开放的软件结构使其具有极大的扩展空间
因此,这一技术自推出以来就受到了广泛的欢迎,可以说,UD
A技术是继ODBC数据访问技术的另一个飞跃。
UDA技术包括OLE DB和ADO两层标准接口,OLE DB是系统级的 编程
它定义了一组接口COM该接口包装了各种数据系统的访问操作
这组接口为数据用户和数据提供者建立了标准,OLE DB还提供了
提供查询、缓存、数据等标准服务组件 更新、事务处理等
因此,数据提供商只需要在用户中实现一些简单的数据操作
获取所有数据控制能力。
ADO它是通过应用层的编程接口OLE DB提供的COM接口访问数据,
适用于各种客户机/ 基于服务器应用系统和服务器应用系统Web特别是在某些应用中
脚本语言中访问数据库的操作ADO主要优势。ADO是一套自动化技术
与其他一些对象模型,如DAO(Data Ac
cess Object)、RDO(Remote Data Object)具有更好的灵活性,如使用
访问数据更方便、更有效。
图1显示了统一数据访问的软件层次模型。
图1 UDA层次结构图
从图中可以看出,应用程序可以通过ADO也可以直接访问数据
接通过OLE DB然而,访问数据ADO则通过OLE DB访问底层数据。OLE
DB它分为两部分,一部分由数据提供商实现,包括一些基本功能,如获取
另一部分由系统提供, 包括一些高
等级服务,如游标功能、分布式查询等。这种层次结构是由数据制成的
用户为应用程序提供了多种选择,简化了数据提供商的服务技能
能够实现的手段,只需按下OLED B写一个规范COM组件程序可以做到
第三方更容易发布数据,而在应用程序方可以获得全面的功能服务,
这充分体现了OLE DB两层结构的优点。
由于OLE DB和ADO都以COM因此,实现组件的形式,COM组件的各种特性
性也使构建数据应用更加灵活,而不仅限于一般客户机/服务
器或Web应用模型不仅适用于以数据为中心的应用,也适用于多层结
构建分布式软件系统。COM组件的 配置,我们可以建立各种复杂
应用系统。使用从COM到DCOM位置透明技术,我们可以很明技术
立分布式应用系统;MTS(Microsoft Transaction Server)运行环
境,我们也可以在数据访问一层增加 并利用安全控制MTS的对象管
使数据访问更有效率。所有这些功能都不需要数据提供商编写代码
现,只需在DCOM或MTS常规配置可以在环境中进行。
可以说,一致数据访问技术的核心是OLE DB,OLE DB建立了数据
访问的标准接口抽象形成所有数据源(rowset)的概
念。OLE DB主要包括以下模型COM对象:
(1)数据源(Data source)对象 数据源对应于数据提供
它负责管理 用户 与数据源建立连接等初始操作。
(2)会话(Session)对象 在数据源连接的基础上建立会话对象
对象提供事务控制机制。
(3)命令(Command)对象 数据用户使用命令对象 执行各种数据
查询命令、修改命令等操作。
(4)行集(Rowset)对象 提供数据的抽象表示可以是命令执行
行的结果也可以直接由会话对象产生,是应用程序的主要操作对象

OLE DB对象模型非常简单,这也带来了灵活性
的几个COM对象也可以看到这一点。接下来,我们将从应用层的角度
过建立在OLE DB基础上的ADO分析和使用对象模型结构,帮助读者
进一步了解一致数据访问技术。
二、ADO对象模型
ADO对象模型定义了一组可编程的自动化对象Visual Bas
ic、Visual C 、 Java以及其他支持自动化特性的脚本语言。AD
O最早被用于Microsoft Internet In formation Server中访问数据
与一般数据库接口相比,库的接口,ADO通过网络环境,可以更好地利用网络环境
优化技术,尽量减少网络流量;ADO另一个特点是使用简单,而不是
仅仅因为它是高级用户的数据库接口,更因为它使用了一组简单的数据库接口
化的接口用以处理各种数据源。这两个特性使得ADO必将取代RDO和DA
O,成为应用层数据接口的最终标准。
我们也看到了图1ADO实际上是OLE DB该结构的应用层接口
它还为一致的数据访问接口提供了良好的可扩展性,不再局限于特定的数据访问接口
因此,数据源,ADO可以处理各种事情OLE DB支持的数据源。
图2是ADO对象模型图。
图2 ADO对象模型
在ADO模型中只有三个主要对象:Connection、Command和Records
et,其他四个集合对象Errors、Properties、Parameters和Fields分别
对应Error、Property、Parameter和Field对象,整个ADO对象模型由
由这些对象组成。
一个典型的ADO应用使用Connection然而,对象与数据源建立连接
后用一个Command对象命令操作数据库,如查询或更新数据
据等,而Recordset用于维护或浏览结果集数据。Comm
and使用的命令语言对应于底层OLE DB不同的数据源
不同的命令语言可用于数据源,通常用于关系数据库 sql作
命令语言。
在Connection、Command和Recordset 3个对象中,Command对象是
它是否有效取决于可选对象OLE DB数据提供商是否实现了?IComman
d接口。由于OLE DB可提供关系数据源或非关系数据源,
因此,在非关系数据源系数据源SQL命令查询数据可能无效
至Command不能使用命令对象。
从结构上看,ADO模型很简单,但是使用起来很灵活。先来看看。
从单个对象的角度进行讨论:
() Connection对象 Connection对象代表与数据源之间的一个
连接,ADO的Connec tion对象封装了OLE DB的数据源对象和会话对象
。根据OLE DB提供者的不同 性能,Conne ction对象的特性也有所不同
,所以Connection对象的方法和属性不一定都可以使用。利用Connect
ion对象,我们可以完成以下一些基本设置操作。
  a.通过ConnectionString、ConnectionTimeOut和Mode属性设置
连接串、超时信息、访问 模式。
  b.还可以设置CursorLocation属性以便指定使用客户端游标,以
便在客户程序中使用批处理修改方式。
  c.设置连接的缺省数据库属性DefaultDatabase。
  d.设置OLE DB提供者的属性Prov ider。
  e.通过Open和Close控制Connection对象与物理数据源的连接。
  f.通过Execute方法执行命令。
  g.提供事务机制,通过BeginTrans、CommitTrans和RollbackTran
s方法实现事务控制。
  h.通过Errors集合属性检查数据源的错误信息。
  i.通过OpenSchema方法获取数据库的表信息。
  Connection对象是ADO的基本对象之一,它独立于所有其他的对象
。如果我们要对数据库进行查询操作,既可以使用Execute方法,也可
以使用Command对象。使用Execute方法比较简便,但用Command对象可
以保存命令的信息,以便多次查询。
  (2) Command对象 Command对象代表一个命令,可以通过其方法执
行针对数据源的有关操作,比如查询、修改等。Command对象的用法如
下:
  a.通过CommandText属性设置命令串。
  b.通过Parameters集合属性和Parameter对象定义参数化查询或
存储过程的参数。
  c.通过Execute方法执行命令,可能的话,返回Recordset对象。
  d.在执行命令之前,可通过设置CommandType属性以便优化性能。
  e.可以通过Prepared属性指示底层的提供者为当前命令准备一个
编译过的版本,以后再执行时,速度会大大加快。
  f.通过CommandTimeOut属性设置命令执行的超时值(以秒为单位)

  g.可以设置ActiveConnection属性,为命令指定连接串,Command
对象将在内部创建C onnection对象。
  h.可以设置Name属性,这样以后可以在相应的Connection对象上
按Name属性指定的方法名执行。
  Command对象执行时,既可以通过ActiveConnection属性指定相连
的Connection对象,也可以独立于Connection对象,直接指定连接串,
即使连接串与Connection对象的连接串相同,Command对象仍然使用其
内部的数据源连接。
(3)Recordset对象 Recordset对象代表一个表的记录集或者命令
执行的结果,在记录集中,总是有一个当前的记录。记录集是ADO管理
数据的基本对象,所有的Recordset对象都按照行列方式的表状结构进
行管理,每一行对应一个记录(Record),每一列对应一个域(Field)。
Recordset对象也通过游标对记录进行访问,在ADO中,游标分为以下4种
:
  静态游标提供对数据集的一个静态拷贝,允许各种移动操作,包括
前移、后移等等,但其他用户所做的操作反映不出来。
  动态游标允许各种移动操作,包括前移、后移等等,并且其他用户
所做的操作也可以直接反映出来。
  前向游标允许各种前向移动操作,不能向后移动,并且其他用户所
做的操作也可以直接反映出来。
  键集(keyset)游标 类似于动态游标,也能够看到其他用户所做的
数据修改,但不能看到其他用户新加的记录,也不能访问其他用户删除
的记录。
  Recordset对象的用法如下:
  a.利用CursorType属性设置游标类型。
  b.通过Open方法打开记录集数据,既可以在Open之前对ActiveCon
nection属性赋值, 指定Recordset对象使用连接对象,也可以直接在O
pen方法中指定连接串参数,ADO将创建一个内部连接,即使连接串与外
部的连接对象相同,它也使用新的连接对象。
  c.Recordset对象刚打开时,当前记录被定位在首条记录,并且BOF
和EOF标志属性为F alse,如果当前记录集为空记录集,则BOF和EOF标
志属性为True。
  d.通过MoveFirst、MoveLast、MoveNext和MovePrevious方法可
以对记录集的游标进行移动操作。如果OLE DB提供者支持相关功能的
话,可以使用AbsolutePosition、Absol utePage和Filter属性对当前
记录重新定位。
  e.ADO提供了两种记录修改方式:立即修改和批修改。在立即修改
方式下,一旦 调用U pdate方法,则所有对数据的修改立即被写到底层
的数据源。在批修改方式下,可以对多条记录进行修改,然后调用Upda
teBatch方法把所有的修改递交到底层数据源。递交之后,可以用Stat
us属性检查数据冲突。
  Recordset对象是ADO数据操作的核心,它既可以作为Connection
对象或Command对象执行特定方法的结果数据集,也可以独立于这两个
对象而使用,由此可以看出ADO对象在使用上的灵活性。
  上面3个对象都包含一个Property对象集合的属性,通过Property
对象可使ADO动态暴露出底层OLE DB提供者的性能。由于并不是所有
的底层提供者都有同样的性能,所以ADO 允许用户动态访问底层提供
者的能力。这样既使得ADO很灵活,又提供了很好的扩展性。
  ADO的其他集合对象及其元素对象,都用在特定的上下文环境中,
比如Parameter对象一定要与某个Command对象相联系后,才能真正起
作用。而另外三个对象Field、Error和Property对象只能依附于其父
对象,不能单独创建这些对象。
  三、在多种语言中使用ADO
  以上介绍了ADO的对象模型,现在我们来讨论如何在不同的语言环
境中使用ADO对象。
  因为ADO是作为自动化组件程序实现的,所以我们可以在任何支持
COM和自动化特性的语言环境中使用ADO,比如Visual Basic、Visual
C++、ASP和Java等等,下面分别加以介绍。
  1. 在Visual Basic应用中使用ADO
  Visual Basic应用在设计模式和运行模式下都可以创建和使用自
动化对象,在设计模式下,像ADO这样的对象库可以作为内部对象来使
用,我们只需在"Project"菜单下的"Ref erences"命令弹出的对话框
中选中ADO对象库"Microsoft ActiveX Data Objects Libra ry",于
是我们就可以在程序中直接声明或新建ADO对象,举例如下:
  Dim cn as New ADODB.Connection
  Dim cmd as New ADODB.Command
  Dim rs as New ADODB.Recordset
  可以看出,在设计时使用ADO对象非常方便,而且Visual Basic设
计环境中提供的对象 浏览器(Object Browser)功能允许用户很方便地
查看ADO对象的属性和方法。
  我们也可以在运行时创建自动化对象,使用Visual Basic的Creat
eObject 函数可以创建任意的自动化对象,由于ADO中只有Connection
对象、Command对象和Recordset对象可以被独立创建,所以我们也只
能创建这3种对象,举例如下:
  Dim cn
  Set rs=CreateObject("ADODB.Connection ")
  Dim cmd
  Set rs=CreateObject("ADODB.Command")
  Dim rs
  Set rs=CreateObject("ADODB.Recordset")
  不管是设计模式还是运行模式,调用ADO对象的属性和方法都非常
简单,直接调用即可。
  2. 在ASP的 vbscript中使用ADO
  ADO对象也可以用于HTML和Active Server Page的VBScript脚本
代码,VBScript脚本代码与Visual Basic的代码很类似,它们内嵌在HT
ML或ASP文件的特定标记对内部。但 vb Script引擎比Visual Basic的
设计环境或运行库在功能上还是要弱一些,首先,在VBScri pt代码中,
没有与设计环境类似的用法,VBScript引擎不能装入ADO类型库,所以
不能使用New操作符创建ADO对象,但可以使用CreateObject函数创建
对象;其次,ADO对象库中用到的常量只能通过包含文件引入,随ADO一
起提供的Adovbs.inc文件包含所有ADO常量的定义,我们可在脚本代码
中直接包含此文件。
  因此,为了在VBScript代码中使用ADO,首先要包含Adovbs.inc文
件,然后使用Create Object函数创建ADO对象,以后就可以调用这些对
象的属性或方法了。下面的例子显示了在ASP文件中用ADO列出数据表
中所有作者的姓名和职称,代码如下:
  Using ADO in a Visual Basic Script Web Page
  Using ADO in a Visual Basic Script
  Web Page
  myConnection.Open "DSN=MySamples;UID=sa"
  SQLQuery = " select AuthorName, Title from AuthorDB"
  set rs = myConnection.Execute(SQLQuery)%
  WIDTH=200
  Title ID
  SIZE=1
  Title
  "arial narrow" size=1
  "arial narrow" size=1
  3. 在Visual C++中使用ADO
  在Visual C++中使用ADO有多种方法,第一种方法是我们使用CoCr
eateInstance函数创建ADO对象,并得到对象的IDispatch接口指针,然
后调用其Invoke函数,用这种方法需要我们自己处理参数和返回值,AD
O提供了Adoid.h和Adoint.h头文件分别定义了ADO对象的CLSID和接口
ID;第二种方法是利用#import编译指示符(在Visual C++ 5.0及以后
的版本中可以使用),可以方便地使用ADO对象;第三种方法是利用MFC(
Microsoft Foundation C lass)库提供的IDispatch接口封装类COleD
ispatch driver创建和调用ADO对象。
  下面的代码显示了在Visual C++创建数据源连接的过程:
  GUID connectionCLSID;
  HRESULT hResult = ::CLSIDFromProgID(L"ADODB.Connection",
  &connectionCLSID);
  if (FAILED(hResult))
  {
  ......
  }
  IDispatch *pDispatch = NULL;
  hResult = CoCreateInstance(connectionCLSID, NULL,
  CLSCTX_SERVER, IID_IDispatch, (void **)&pDispatch);
  if (FAILED(hResult))
  {
  ......
  }
  COleDispatchDriver driver;
  driver.AttachDispatch(pDispatch, FALSE);
  TRY
  {
  BYTE parms =VTS_BSTR;
  driver.InvokeHelper(0xa, DISPATCH_METHOD,
  VT_EMPTY, &hResult, parms,L"Provider=SQLOLEDB;
  User ID=sa;Pass word=;" L"Initial Catalog=LEAVES;
  Data Source=NetTestServer");
  }
  END_TRY
  driver.DetachDispatch();
  ......
  4. 在Java中使用ADO
  在Java程序中可以引入ADODB类,然后声明ADO变量,也可以使用ne
w操作符创建ADO变量。下面的代码说明了如何在Java中打开与数据源
连接:
  import msado10.*;
  _Connection m_conn = null;
  _Recordset m_rs = null;
  _Command m_cmd = null;
  void OpenConnection()
  {
  String s;
  Properties properties;
  try
  {
  properties = m_conn.getProperties();
  m_conn.Open("dsn=MySamples", "sa", "");
  properties = null;
  }
  catch (Exception e)
  { System.out.println(" Unable to make a connection ")
;
  }
  }

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-963066/,如需转载,请注明出处,否则将追究法律责任。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章