ADO技术在VC编程中的研究及应用分析

2013-04-25 02:17
电子科技 2013年1期
关键词:处理程序数据源控件

郭 强

(西安电子科技大学 电子工程学院,陕西 西安710071)

数据库、互联网技术作为当今两大热门计算技术,两者息息相关,所以实现对数据库的访问就显得尤为重要。作为数据库开发的前端工具,文中选择Visual C++SDK(Software Development Kit)。该平台提供了多种数据库访问技术—ODBC API、MFC ODBC、DAO、OLE DB、ADO等。这些技术各有特点,他们提供了简单、灵活、访问速度快、可扩展性好的开发技术。与上述其他技术相比,ADO基于OLE DB访问接口,采用面向对象方法,对接口进行封装,使程序开发得到简化。ADO技术属于数据库访问的高层接口。

1 ADO接口和结构

ADO(ActiveX Data Ob1ject,ActiveX数据对象)是微软提供的一种面向对象、与语言无关的数据访问应用编程接口。之前使用的OLE DB API,实现了对数据库的底层访问,但它仅支持C/C++,而ADO是对OLE DB API进行封装,实现了对数据库的高层访问,同时也提供适用于多种编程语言的访问技术,包括Visual C++、Visual Basic、Visual J++等。由于ADO提供了访问自动化接口,所以它也支持描述的脚本语言,如VBScript、JavaScript。

在ADO的对象结构中,对象与对象之间的层次结构不够明显。在模型层次上,ADO基于OLE DB技术,但在应用层次上,又高于OLE DB技术,因为它简化了对对象模型的操作,并且不依赖对象之间的相互层次关系。在多数情况下,只需关心所要创建和使用的对象,并不需要了解其父对象是否存在。所以,在实际编程应用中,不必关心对象的构造顺序和构造层次。ADO继承了OLE DB访问数据源的高效性,几乎可以访问所有关系型数据源和非关系型数据源,使得应用程序具有良好的通用性和灵活性[1]。

图1 ADO访问数据库的结构

2 ADO中几个关键的模型对象

ADO被设计来继承微软早期的数据访问对象层,包括RDO(Remote Data Objects)和DAO(Data Access Objects),ADO的顶层对象包括连接、记录集、命令、记录、流、错误、字段、参数和属性等[2]。

2.1 连接对象(Connection)

Connection对象用于表示与数据源的连接,通过“连接”,可以从应用程序访问数据源,连接是交换数据所必需的环境。通过如Microsoft IIS(Internet Information Server)作为媒介,应用程序可直接或间接访问数据源。

2.2 记录集对象(Recordset)

Recordset对象用于处理数据源表格集,获取并修改数据。如果命令是在表中按信息行返回数据的查询,则这些行将会存储在本地。对象模型将该存储体现为Recordset对象。但是,不存在仅代表单独一个Recordset行的对象。记录集是在行中检查和修改数据的主要方法。对存储在本地的行的操作也就是对所取得的表中每一条记录的操作。

2.3 命令对象(Command)

通过已建立的连接发出的“命令”可以用某种方式来操作数据源,经常用到的方法是Execute。该方法可执行Command对象的CommandText属性中指定的查询、SQL语句或存储过程。如果CommandText属性指定以行返回的查询,执行产生的任何结果都将存储在新的Recordset对象中。如果此命令不是以行返回的查询,提供者将返回关闭的Recordset对象。在文中的实例中,Execute对SQL Sever操作有Update、Insert、Delete等。

2.4 错误对象(Error)

Error对象用于获得所产生错误的详细信息。错误随时可在应用程序中发生,通常是由于无法建立连接、无法执行命令或无法对某些状态的对象进行操作。对错误的获取和处理利用_com_error类来实现,通过对异常的捕获,可以轻易地定位错误的发生,提高改正错误的效率。

2.5 参数对象(Parameter)

Parameter对象用于对传递给数据源的命令赋参数值。通常,命令需要的变量部分即“参数”可以在命令发布之前进行更改。例如,可重复发出相同的数据检索命令,但每次均可更改指定的检索信息。参数对于函数活动相同的可执行命令较有用,这样就可以了解命令的功能,但不必知道它是如何工作的。例如,发出一项银行过户命令,资金由一方账户支付给另一方,可将要过户的金额设置为参数。

图2 ADO对象的编程模型

3 ADO事件

简单的数据库访问技术对ADO事件[3]概念涉及较少,但这并不代表可以忽略ADO事件的作用。微软最初的ADO应用并不包含事件概念,直到ADO2.0,才将其引入编程模型,它的出现,为实现应用程序中包含多个异步任务提供了手段。

ADO事件模型支持某些同步和异步的ADO操作,ADO对象模型无法显式体现事件,只能在调用事件处理程序例程时表现出来。事件实际就是对在应用程序中定义的事件处理程序例程的调用。由于ADO支持异步操作,所以,在操作完成之后被调用的事件处理程序尤其重要。

事件分为两类,ConnectionEvent和RecordsetEvent。ConnectionEvent类从属于Connection对象的操作,在连接开始或结束时,或在Command被执行时,将引发该类事件;RecordsetEvent类从属于Recordset对象的操作,在Recordset对象的记录中定位、更改其中的字段时,或在Recordset作任何修改时,将引发该类事件。

ADO事件的事件类型有Will事件,Complete事件和其他事件。Will事件是在操作开始之前调用的事件处理程序,它使应用者有机会检查或修改操作参数,决定是取消操作还是允许完成该操作。Complete事件是在操作完成之后调用的事件处理程序,它向应用程序发出操作已结束的通知,除此之外,当挂起的操作被Will事件处理程序取消时,该事件处理程序也会收到通知。至于事件处理程序如何共同工作,文中涉及的实例中并未体现,不作深入剖析。

4 VC编程中ADO的两种实现方法

4.1 使用ActiveX控件开发应用程序

使用ActiveX控件是开发ADO应用程序的简单方法,仅 需Microsoft ADO Data Control和Microsoft DataGrid Control两个控件就可实现。ADO Data控件实现了ADO对数据源(任何OLE DB数据源)的快速连接和访问;数据捆绑控件DataGrid将ADO Data控件的访问结果在界面上显示出来。

图3 ADO Data控件控制属性设置对话框

图3所示的设置对话框主要用来设置与数据源连接有关的属性。连接数据源的方式有3种,分别使用数据连接文件、使用ODBC数据源和使用连接字符串描述的数据源,这里选择第3种方式实现。连接字符串中包含了连接数据源的信息,这个字符串可以通过点击“Build”按钮设置数据链接属性来完成。接下来,是对记录源的定义。打开“RecordSource”选项卡,设置命令类型和命令文本。这些对ADO Data控件简单的设置即实现了ADO与SQL Server数据库的连接。最后,要将获得的结果在DataGrid控件界面上进行显示。要实现这个目标,必须在这两个控件之间建立关联,方法是设置DataGrid属性中的DataSource为ADO Data控件的ID,如图4所示。

图4 DataGrid控件属性设置对话框

经过对两个控件属性的设置,不写任何代码就可以产生一个完整并且有实际意义的应用程序。这种方式简洁、易操作,但也有不足之处。它增加了许多不必要的系统资源开销,例如当要对数据源进行查询或者操作时,这种方式每次查询或者操作都会建立一个与数据源的连接,这种重复连接会降低系统的性能,而且这种方法只适用于将查询结果显示出来,对添加或者更新等要求较高的应用就有些力不从心了。

4.2 使用ADO对象开发应用程序

为最大限度发挥ADO技术高速灵活的特点,让应用者完全实现对数据库的控制,利用ADO对象开发应用程序,无疑是最完美的选择。使用ADO对象开发应用程序[4],有以下步骤:

(1)导入ADO文件。为使编译器能正确编译ADO,首先要导入工程所需要的动态链接库(DLL)文件msado15.dll。在stdafx.h文件里直接使用#import引入,代码如下

ADO类的定义是作为一种资源存储在指定的动态链接库文件中,在其内部称为类型库。类型库描述了自治接口,以及C++使用的COM Vtable接口。使用#import指令,在运行时Visual C++会从动态链接库中读取这个类型库,并以此创建一组C++头文件,这些头文件具有.tli和.tlh扩展名,可以在工程目录下找到这两个文件,在C++程序代码中调用的ADO类都要在这些文件中定义。

(2)初始化OLE/COM库环境。ADO是一个用于存储数据源的COM组件,因此在调用前,必须初始化OLE/COM库环境。

接下来就是取得一个可以进行操作的记录集对象。定义一个指向Recordset对象的指针,并为其创建对象实例,利用Open方法打开结果记录集

(4)对获取的数据进行操作。这一步主要是在Visual C++平台下对SQL Server数据库的操作,包括插入记录、修改记录、更新记录、删除记录等,相关的操作命令可参阅有关手册。操作中,需要注意的一点是对记录集的判空命令的使用,只有恰当地使用判空命令才能准确的对记录集进行操作,避免操作异常及操作错误的出现。

(5)关闭记录集、关闭连接。对数据库操作完毕后,先关闭记录集,后关闭连接,同时释放建立的对象实例。在程序的实例初始化时,对OLE/COM组件进行了初始化,加载了ADO运行所需要的动态链接库文件的类库。相应地,在程序终止时,要使用CoUninitialize()关闭当前线程的组件对象模型库,卸载所有动态链接库载入的类库。

这种方法充分利用了ADO的资源,对记录集的操作可随应用者的意图完成,实现了ADO访问及操作数据库数据的灵活性。

5 结束语

对ADO的应用结构和对象模型做了介绍,详细论述了ADO的工作原理和对数据库的访问,实现了与数据源的连接和对记录集的操作。

ADO作为微软着重推出的数据库访问接口技术,得取了广范应用。它定位于高层访问,对底层控制透明,为使用者在建立应用程序的方式上提供了较大的方便性和灵活性。ADO技术的优越性,正使其逐步替代ODBC等数据库访问技术,成为事实上的数据库访问标准。

[1] 郑章,陈刚,张勇,等.Visual C++6.0数据库开发技术[M].北京:机械工业出版社,1999.

[2] 刘增军,向为,孙广富.基于ADO的数据库开发技术研究[J].科学技术与工程,2007,7(5):747-752.

[3] 曹红根,丁永.数据库应用系统开发实例[M].北京:清华大学出版社,2008.

[4] 徐枫,马国之,刘良旭.基于ADO技术的数据库访问研究与实现[J].计算机工程与设计,2004,25(1):107-110.

猜你喜欢
处理程序数据源控件
高速公路工程变更与计量支付处理程序的优化方法
基于.net的用户定义验证控件的应用分析
关于.net控件数组的探讨
Web 大数据系统数据源选择*
基于不同网络数据源的期刊评价研究
基于C++的数控加工通用后处理程序的开发应用研究
企业危机公关管理问题分析
处理房地产纠纷中行政与民事交叉问题的正当程序
基于真值发现的冲突数据源质量评价算法
分布式异构数据源标准化查询设计与实现