第9章ADO客户数据库编程.docx

上传人:b****7 文档编号:10243006 上传时间:2023-02-09 格式:DOCX 页数:59 大小:500.69KB
下载 相关 举报
第9章ADO客户数据库编程.docx_第1页
第1页 / 共59页
第9章ADO客户数据库编程.docx_第2页
第2页 / 共59页
第9章ADO客户数据库编程.docx_第3页
第3页 / 共59页
第9章ADO客户数据库编程.docx_第4页
第4页 / 共59页
第9章ADO客户数据库编程.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

第9章ADO客户数据库编程.docx

《第9章ADO客户数据库编程.docx》由会员分享,可在线阅读,更多相关《第9章ADO客户数据库编程.docx(59页珍藏版)》请在冰豆网上搜索。

第9章ADO客户数据库编程.docx

第9章ADO客户数据库编程

第9章ADO客户数据库编程

ADO,即ActiveXDataObjects,是一种特殊的OLEDB客户程序,它允许访问程序在VisualC++、VisualBasic、VBscript、Java等编程语言中访问。

虽然ADO的巨大优势在于VisualBasic和VBscript的使用,但是在某些特殊的情况下,ADO在VisualC++中的访问是无法避免的。

正是由于ADO本身是一种OLEDB客户程序,所以在数据库应用程序里使用ADO变得更加容易。

ADO同OLEDB、数据库应用以及数据源之间的关系可以用图9-1表示:

图9-1ADO同OLEDB、数据库应用以及数据源之间的关系

本章详细介绍ADO的基本原理和数据库访问技术。

9.1ADO原理

9.1.1ADO与OLEDB

ADO是微软最新的对象层次上的数据操作技术,它为操作OLEDB数据源提供了一套高层次自动化接口。

尽管OLEDB已经是一个强大的数据操作接口,然而大多数数据库应用开发者并不需要OLEDB提供的操作数据的底层控制接口。

大多数开发者对于管理内存资源、手工聚合组件以及其它的底层操作接口并不是很感兴趣。

另外,开发者经常使用高层的、不支持指针和C++函数调用规范的开发语言,OLEDB为这种需要提供了方便。

从功能上来说,ADO也是一种OLEDB客户程序,不过它不依赖于特定的OLEDB服务器,相反,它支持所有的OLEDB服务提供者。

通过这些OLEDB服务提供者,ADO支持客户/服务器模式和基于Web的数据库应用。

ADO支持客户/服务器模式和基于Web的数据操作,ADO尤其支持通过客户/服务器模式或者基于Web模式访问微软的SQLServer数据库服务器。

9.1.2ADO的优越性

对于数据库编程人员来说,ADO具有如下优越性:

∙便于使用。

∙支持多种编程语言,包括VisualBasic、Java、C++、VBScript和JavaScript。

∙支持任何的OLEDB服务器,ADO可以操作任何的OLEDB数据源。

∙不损失任何OLEDB的功能,ADO支持C++编程人员操作底层的OLEDB接口。

∙可扩展性,ADO能够通过提供者属性集合动态地表示指定的数据提供者,还能够支持COM的扩展数据类型。

9.1.3ADO对象模型

ADO对象模型包括以下关键对象:

∙Connection对象

在数据库应用里操作数据源都必须通过该对象,这是数据交换的环境。

Connection对象代表了同数据源的一个会话,在客户/服务器模型里,这个会话相当于同服务器的一次网络连接。

不同的数据提供者提供的该对象的集合、方法和属性不同。

借助于Connection对象的集合、方法和属性,可以使用Open和Close方法建立和释放一个数据源连接。

使用Execute方法可以执行一个数据操作命令,使用BeginTrans、CommitTrans和RollbackTrans方法可以启动、提交和回滚一个处理事务。

通过操作theErrors集合可以获取和处理错误信息,操作CommandTimeout属性可以设置连接的溢出时间,操作ConnectionString属性可以设置连接的字符串,操作Mode属性可以设置连接的模式,操作Provider属性可以指定OLEDB提供者。

∙Command对象

Command对象是一个对数据源执行命令的定义,使用该对象可以查询数据库并返回一个Recordset对象,可以执行一个批量的数据操作,可以操作数据库的结构。

不同的数据提供者提供的该对象的集合、方法和属性不同。

借助于Command对象的集合、方法和属性,可以使用Parameters集合制定命令的参数,可以使用Execute方法执行一个查询并将查询结果返回到一个Recordset对象里,操作CommandText属性可以为该对象指定一个命令的文本,操作CommandType属性可以指定命令的类型,操作Prepared可以得知数据提供者是否准备好命令的执行,操作CommandTimeout属性可以设置命令执行的溢出时间。

∙Parameter对象

Parameter对象在Command对象中用于指定参数化查询或者存储过程的参数。

大多数数据提供者支持参数化命令,这些命令往往是已经定义好了的,只是在执行过程中调整参数的内容。

借助于Parameter对象的集合、方法和属性,可以通过设置Name属性指定参数的名称,通过设置Value属性可以指定参数的值,通过设置Attributes和Direction、Precision、NumericScale、Size与Type属性可以指定参数的信息,通过执行AppendChunk方法可以将数据传递到参数里。

∙Recordset对象

如果执行的命令是一个查询并返回存放在表中的结果集,这些结果集将被保存在本地的存储区里,Recordset对象是执行这种存储的ADO对象。

通过Recordset对象可以操纵来自数据提供者的数据,包括修改和更新行、插入和删除行。

ADO定义了如表9-1所示的光标类型。

表9-1ADO的光标类型

光标类型

描述

adOpenDynamic

允许添加、修改和删除记录,支持所有方式的光标移动,其他用户的修改可以在联机以后仍然可见

adOpenKeyset

类似于adOpenDynamic光标,它支持所有类型的光标移动,但是建立连接以后其他用户对记录的添加不可见,其他用户对记录的删除和对数据的修改是可见的。

支持书签操作

adOpenStatic

支持各种方式的光标移动,但是建立连接以后其他用户的行添加、行删除和数据修改都不可见,支持书签操作

adOpenForwardOnly

只允许向前存取,而且在建立连接以后,其他用户的行添加、行删除和数据修改都不可见,支持书签操作

ADO定义了如表9-2所示的锁定类型。

表9-2ADO的锁定类型

锁定类型

描述

adLockReadOnly

(缺省)数据只读

adLockPessimistic

锁定操作的所有行,也称为消极锁定

adLockOptimistic

只在调用Update方法时锁定操作的行,也称为积极锁定

adLockBatchOptimistic

在批量更新时使用该锁定,也称为积极批量锁定

ADO定义了如表9-3所示的光标服务位置。

表9-3ADO的锁定类型

光标服务位置

描述

adUseNone

不使用光标服务位置

adUseClient

使用客户端光标

adUseServer

(缺省)使用数据服务端或者驱动提供端光标

借助于Recordset对象的集合、方法和属性,可以通过设置CursorType属性设置记录集的光标类型,通过设置CursorLocation属性可以指定光标位置,通过读取BOF和EOF属性的值,获知当前光标在记录集里的位置是在最前或者最后,通过执行MoveFirst、MoveLast、MoveNext和MovePrevious方法移动记录集里的光标,通过执行Update方法可以更新数据修改,通过执行AddNew方法可以执行行插入操作,通过执行Delete方法可以删除行。

∙Field对象

Recordset对象的一个行由一个或者多个Fields对象组成,如果把一个Recordset对象看成一个二维网格表,那么Fields对象就是这些列。

这些列里保存了列的名称、数据类型和值,这些值是来自数据源的真正数据。

为了修改数据源里的数据,必须首先修改Recordset对象各个行里Field对象里的值,最后Recordset对象将这些修改提交到数据源。

借助于Field对象的集合、方法和属性,可以通过读取Name属性,获知列的名称。

通过操作Value属性可以改变列的值,通过读取Type、Precision和NumericScale属性,可获知列的数据类型、精度和小数位的个数,通过执行AppendChunk和GetChunk方法可以操作列的值。

∙Error对象

Error对象包含了ADO数据操作时发生错误的详细描述,ADO的任何对象都可以产生一个或者多个数据提供者错误,当错误发生时,这些错误对象被添加到Connection对象的Errors集合里。

当另外一个ADO对象产生一个错误时,Errors集合里的Error对象被清除,新的Error对象将被添加到Errors集合里。

借助于Errosr对象的集合、方法和属性,可以通过读取Number和Description属性,获得ADO错误号码和对错误的描述,通过读取Source属性得知错误发生的源。

∙Property对象

Property对象代表了一个由提供者定义的ADO对象的动态特征。

ADO对象有两种类型的Property对象:

内置的和动态的。

内置的Property对象是指那些在ADO里实现的在对象创建时立即可见的属性,可以通过域作用符直接操作这些属性。

动态的Property对象是指由数据提供者定义的底层的属性,这些属性出现在ADO对象的Properties集合里,例如,如果一个Recordset对象支持事务和更新,这些属性将作为Property对象出现在Recordset对象的Properties集合里。

动态属性必须通过集合进行引用,比如使用下面的语法:

MyObject.Properties(0)

或者

MyObject.Properties("Name")

不能删除任何类型的属性对象。

借助于Property对象的集合、方法和属性,可以通过读取Name属性获得属性的名称,通过读取Type属性获取属性的数据类型,通过读取Value属性获取属性的值,

ADO对象模型如图9-2所示。

图9-2ADO对象模型

每个Connection,Command,Recordset和Field对象都有一个Properties集合,如图9-3所示。

图9-3ADO的Properties集合和Property对象

9.1.4ADO编程

通常情况下,一个基于ADO的数据库应用使用如下过程操作数据源里的数据:

(1)创建一个Connection对象。

定义用于连接的字符串信息,包括数据源名称、用户ID、口令、连接超时、缺省数据库以及光标的位置。

一个Connection对象代表了同数据源的一次会话。

可以通过Connection对象控制事务,即执行BeginTrans、CommitTrans和RollbackTrans方法。

(2)打开数据源,建立同数据源的连接。

(3)执行一个SQL命令。

一旦连接成功,就可以运行查询了。

可以以异步方式运行查询,也可以异步地处理查询结果,ADO会通知提供者后台提供数据。

这样可以让应用程序继续处理其它事情而不必等待。

(4)使用结果集。

完成了查询以后,结果集就可以被应用程序使用了。

在不同的光标类型下,可以在客户端或者服务器端浏览和修改行数据。

(5)终止连接。

当完成了所有数据操作后,可以销毁这个同数据源的连接。

9.2ADO的数据库访问规范

VisualC++6.0为ADO操作提供了库支持,一般情况下,每个Windows操作系统的ProgramFiles\CommonFiles\System\ado\目录下都有一个msado*.dll文件,根据Windows版本的不同,该文件可以是msado1.dll、msado15.dll和msado2.dll。

目前ADO的最高版本是2.0。

在利用VisualC++6.0进行ADO编程时,可以借助VisualC++6.0的import宏,将该库文件引用到工程里,从而使msado*.dll库里的数据和函数声明被应用的代码所使用。

通过引用,msado*.dll库在工程里产生了所有ADO对象的描述和声明,这些声明同前面介绍的对象名称基本相似,但有所不同,下面将最常用的操作对象介绍如下:

∙_ConnectionPtr:

指向ADO的Connect对象的指针。

∙_RecordsetPtr:

指向ADO的Recordset对象的指针。

∙_CommandPtr:

指向ADO的Command对象的指针。

∙_ParameterPtr:

指向ADO的Parameter对象的指针。

∙FieldPtr:

指向ADO的Field对象的指针。

∙ErrorPtr:

指向ADO的Error对象的指针。

∙PropertyPtr:

指向ADO的Property对象的指针。

利用上述指针,可以使用9.1.3节里介绍的所有属性和方法进行数据库应用开发。

图9-4是一个最典型的ADO对象使用流程描述。

图9-4ADO的对象使用流程描述

9.3ADO数据库编程实例

9.3.1实例概述

需求调查与分析

某俱乐部为了实现会员管理的自动化,准备开发一套数据库应用软件,以实现对俱乐部会员、社团以及俱乐部消费情况进行计算机管理。

该软件将被安装到俱乐部的所有社团里,会员入会时,在俱乐部总台登记注册,会员可以加入到不同的社团,每个会员可以任意加入社团,从而享受社团会员的消费优惠。

会员消费在相应的俱乐部登记,总台具有监督消费的能力。

数据库系统及其访问技术

这是一个小型的企业数据库应用,我们考虑采用SQLServer7.0作为后台数据库,前端利用ADO数据库访问技术实现对数据库的操作,整个应用基于客户/服务器结构。

实例实现效果

ADODemo是本书用于阐述ADO数据库编程的实例应用程序,该应用程序实现了对俱乐部会员、社团以及消费情况的管理,包括会员注册登记、会员退会、会员及其消费查询,俱乐部社团创建、查询以及撤销管理。

应用程序运行界面如图9-5所示。

图9-5ADODemo实例应用程序的运行效果

9.3.2实例实现过程

数据库设计

可利用SQLServer7.0的数据库设计工具设计本实例的数据库结构。

在本实例里,我们需要利用SQLServer7.0数据库存俱乐部中的如下信息:

∙俱乐部的会员信息,包括会员的自然信息、会员的收入阶层、会员入会时间以及动机、会员的级别以及会员所在的社团信息。

∙俱乐部的社团信息,包括社团的名称、成立时间、收费标准、社长等信息。

∙俱乐部的会员级别信息,包括级别的名称以及不同级别所享受的优惠待遇。

∙俱乐部的福利信息,包括会员可以享受的优惠情况。

∙俱乐部消费信息,包括各社团登记的会员消费情况信息。

∙为了区分婚姻状况,特地设置了婚姻状况信息。

为此我们为数据库设计了七个表:

表“会员”存放俱乐部会员信息,表“社团”存放俱乐部社团信息,表“级别”存放会员的级别信息,表“福利”存放俱乐部提供的福利信息,表“收入阶层”存放会员的收入阶层信息,表“消费”存放会员的消费信息,表“婚姻状况”存放会员的婚姻状况信息。

表9-4列出了表“会员”的结构,表9-5列出了表“社团”的结构,表9-6列出了表“级别”的结构,表9-7列出了表“福利”的结构,表9-8列出了表“收入阶层”的结构,表9-9列出了表“消费”的结构,表9-10列出了表“婚姻状况”的结构。

表9-4表“会员”的结构

字段名称

类型

字段名称

类型

会员ID(key)

int

电话

nvarchar

姓名

nvarchar

国家

nvarchar

卡号

char

收入阶层ID

int

社团ID

int

已婚

smallint

性别

char

入会动机

nvarchar

(续表)

字段名称

类型

字段名称

类型

年龄

smallint

入会时间

datetime

地址

nvarchar

级别ID

int

表9-5表“社团”的结构

字段名称

类型

字段名称

类型

社团ID(key)

int

收费标准

smallint

社团名称

nvarchar

成立时间

datetime

社团描述

nvarchar

社长

nvarchar

表9-6表“级别”的结构

字段名称

类型

字段名称

类型

级别ID(key)

Int

描述

nvarchar

级别名称

Nvarchar

表9-7表“福利”的结构

字段名称

类型

字段名称

类型

福利ID(key)

int

描述

nvarchar

福利名称

Nvarchar

级别ID

int

表9-8表“收入阶层”的结构

字段名称

类型

字段名称

类型

阶层ID(key)

Int

阶层描述

nvarchar

福利名称

Nvarchar

级别ID

int

表9-9表“消费”的结构

字段名称

类型

字段名称

类型

消费ID(key)

int

会员ID

int

描述

nvarchar

消费金额

money

日期

datetime

表9-10表“婚姻状况”的结构

字段名称

类型

字段名称

类型

婚姻ID(key)

Int

婚姻描述

char

为了便于数据查询,我们还设计了两个数据库视图:

v_会员和v_消费,用于创建这两个视图的SQL语句如下:

CREATEVIEWdbo.[v_会员]

AS

SELECT会员.会员ID,会员.姓名,社团.社团名称,会员.性别,会员.年龄,婚姻状况.婚姻描述,

会员.地址,会员.电话,会员.国家,收入阶层.阶层描述,会员.入会动机,会员.入会时间,

级别.级别名称

FROM会员INNERJOIN

社团ON会员.社团ID=社团.社团IDINNERJOIN

收入阶层ON会员.收入阶层ID=收入阶层.阶层IDINNERJOIN

级别ON会员.级别ID=级别.级别IDINNERJOIN

婚姻状况ON会员.已婚=婚姻状况.婚姻ID

CREATEVIEWdbo.[v_消费]

AS

SELECT会员.姓名,会员.卡号,级别.级别名称,消费.描述,消费.日期,消费.消费金额

FROM级别INNERJOIN

会员ON级别.级别ID=会员.级别IDINNERJOIN

消费ON会员.会员ID=消费.会员ID

在实例光盘的Database目录下,membership.mdb文件是存放俱乐部会员信息的Access数据库文件,读者可以通过SQLServer7.0的数据导入(import)工具,将这个数据库导入到SQLServer7.0数据库里。

membership.mdb文件里存放的数据库表的结构可以作为参考,读者如果没有安装SQLServer7.0数据库,可以通过此文件了解数据库的结构信息。

创建ADODemo工程

ADODemo工程是一个基于单文档的应用程序,创建应用程序工程时需要选择基于单文档的应用程序类型。

创建ADODemo工程的步骤如下:

(1)打开VC++的工程创建向导。

从VC++的菜单中执行“File>New”命令,将VC++6.0工程创建向导显示出来。

如果当前的选项标签不是“Projects”,要单击“Projects”选项标签将它选中。

在左边的列表里选择“MFCAppWizard(exe)”项,在“ProjectName”编辑区里输入工程名称“ADODemo”,并在“Location”编辑区里调整工程路径,如图9-6所示。

图9-6工程创建向导

(2)选择应用程序的框架类型。

点击工程创建向导——“New”窗口的OK按钮,开始创建ADODemo工程。

创建ADODemo工程的第一步是在弹出的“MFCAppWizard–Step1”窗口里选择应用程序的框架类型。

如图9-7所示,在本工程里,选择“Singledocument”,保持资源的语言类型为“中文”,点击“Next>”按钮,执行下一步。

图9-7选择应用程序的框架类型

(3)设置应用程序数据库特性。

在弹出的“MFCAppWizard–Step2of6”窗口里,设置“None”,如图9-8所示。

图9-8设置应用程序数据库特性

(4)设置应用程序对复杂文档的支持。

在“MFCAppWizard–Step2of6”窗口里,点击“Next>”按钮,进入“MFCAppWizard–Step3of6”窗口。

在窗口里设置如下两项:

∙None

∙ActiveXControls

如图9-9所示,点击“Next>”按钮,进入下一步。

图9-9设置应用程序对复杂文档的支持

(5)设置应用程序的特征信息。

如图9-10所示的“MFCAppWizard–Step4of6”窗口里列举了工程的特征信息,在本例中,ADODemo工程有如下特征:

∙Dockingtoolbar

∙Initialstatusbar

∙Printingandprintpreview

∙3Dcontrols

∙Normal

图9-10设置应用程序特征信息

(6)选择工程风格和MFC类库的加载方式。

在“MFCAppWizard–Step4of6”窗口里,点击“Next>”按钮,进入“MFCAppWizard–Step5of6”窗口。

在窗口里设置如下三项:

∙MFCStandard

∙Yes,please

∙AsasharedDLL

如图9-11所示,点击“Next>”按钮,进入下一步。

图9-11选择工程风格和MFC类库的加载方式

(7)显示工程创建中的类信息。

在本例中,ADODemo工程包含了四个类:

∙CADODemoApp类,工程的应用类

∙CMainFrame类,工程主框架类

∙CADODemoView类,工程视图类

∙CADODemoDoc类,工程文档类

这四个类构成了应用程序工程的主要框架。

在“MFCAppWizard–Step6of6”窗口里,我们为CADODemoView类选择“ClistView”基类,如图9-12所示。

(8)完成工程创建。

在“MFCAppWizard–Step6of6”窗口里,点击“Finish”按钮,工程创建向导将该次工程创建的信息显示在一个窗口里,如图9-13所示。

在对话框里点击“OK”按钮,ADODemo工程创建完成。

图9-12显示工程创建中的类信息

图9-13工程创建信息

建立数据源

本实例中,我们通过ADO访问SQLServer7.0数据库,因此不需要建立ODBC数据源,通过ADO的数据库访问能力可以直接访问SQLServer7.0数据库,因此在本实例里我们略过这一步。

设计应用程序界面

在9.3.2的第2节,我们利用工程创建向导创建了一个基于单文档界面的工程,本节将完成程序界面的设计工作,主要是菜单设计。

为了支持俱乐部会员入会登记和退会登记、俱乐部社团登记和注销、会员消费登记,我们还需要为应用程序设计五个对话框以实现这五个操作的界面。

1.设计应用程序的主菜单

需要为应用程序设计的菜单包括:

会员菜单、社团菜单以及消费菜单。

这些菜单的标识、标题以及提示信息如表6-4所示。

表9-11工程的菜单资源

标识

标题

提示信息

会员

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1