本文发表在中国人民解放军“信息工程大学”学报 2001年第3期。

ActiveX数据对象之事务控制在VBDELPHI中的应用
                     马根峰1   ,  孙艳2  , 宋伟1
                       
( 1.重庆邮电学院 ,重庆,400065 ;2. 铁道部第十九工程局四处,通辽,028000  )

摘要      事务控制是数据库应用系统中的关键技术之一,本文一开始先对事务控制的概念以及微软的 ActiveX数据对象(ADO)的事务控制做了简介,之后以一个具体的实例给出ActiveX数据对象的事务控制在VB和DELPHI中的使用方法。

关键词    ActiveX数据对象(ADO);事务控制;VB;DELPHI

1     引言 

在数据库的应用中,有时会遇到以独立单元保存或取消对源数据所做的一系列更改。例如在货币转帐时,必须从帐户中减去某个数额并将其对等数额添加到另一个帐户。无论其中的哪个更新失败,都将导致帐户收支不平衡。再如,在进行商品库存管理时,当发生购进或售出商品时,一方面要在商品的销售表中保存该商品的销售记录,另一方面,还要在商品库存中对该种商品的库存进行调整。无论其中的哪个更新失败,都将导致商品收支不平衡。在这种情况下,必须通过事务控制来保证操作的一致性。

2     ActiveX数据对象事务控制

2.1  ActiveX数据对象(ADO)简介

Microsoft ActiveX Data Objects(ADO)是Microsoft开发的数据访问对象,它可使用户通过何OLE DB Provider 访问数据库服务器中的数据。ADO趋向于提供一种稳定的接口,来使用户利用多种不同的数据源包括从非关系型数据源(包括文本文件、电子邮件等)到ODBC关系型数据库。所以它是对ODBC的扩充。

ADO的主要优点是使用简单,快速,内存消耗量低,磁盘的占有量少,在关键

情况下网络的通信量最少,前端与数据存储之间的层次最少,是一种轻便质优的接口。

 2.2   ActiveX数据对象(ADO)事务控制

BeginTrans、CommitTrans和RollbackTrans是ADOConnection部件供数据库应用程序在运行时调用开始事务、控制并保存或放弃所做数据修改的方法。

l  BeginTrans 开始一个事务

当开始一个事务时,后来所有读写数据库的操作都发生在这次事务的环境中,直到本次事务通过调用CommitTrans或RollbackTrans来显示的终止为止。还以商品管理为例,当购进或售出商品时,在商品数据库记录上必须发生两个修改:

       A、购进或销售的记录必须记录在销售表中;

       B、在商品库存中对该类商品的库存进行调整。

         如果出于某种原因,其中的一个操作不能被完成,那么任何一个操作都不应该发生。因为这些操作是相关的,它们发生在同一个事务中。

l  RollbackTrans 取消事务中的修改并终止当前事务

         为了取消对数据库所做的修改,必须用RolllbackTrans方法返回一个事务。RollbackTrans方法取消当前事务中对数据库所做的修改并终止当前事务。

l  CommitTrans  提交一个事务

         为了做永久性的修改,必须CommitTrans方法提交事务,这将保存用户对数据库所做的修改并结束当前事务。

在VB 6.0中,ADO成为它与各种数据源的缺省接口,ADO数据访问方式是现在和未来VB乃至Microsoft的各种应用软件进行数据访问与应用的主流。

而在DELPHI中,基于DBE(Borland Database Engine的简称,即Borland数据库引擎)的数据库访问方式是DELPHI的标准的、传统的方式;基于ADO技术的数据库访问方式,这是DELPHI 5.0新增的功能。DELPHI 5.0 提供了一整套ADO组件,封装了ADO框架的所有功能。

下面以商品库存管理来分别阐明ADOConnection的事务控制在VB和DELPHI中的应用。

3     商品库存管理中的数据库

该数据库GoodsManagement用Microsoft的SQL Server创建,包括三个用户数据表,用户表Users、库存表Goods、进销表InOutGoods,每个数据表的表结构如下:

l  用户表Users

字段名        数据类型        长度

用户名        VARCHAR               8

用户类型              VARCHAR               10

用户口令              VARCHAR               6

    主键为: 用户名

     注:

      用户类型有一般用户和系统管理员两种,其中一般用户只能进行销售商品,碉系统管理员还可以增加或删除用户,由于本文章只是阐述ADOConnection的事务控制,所以也就涉及到用户管理。

l  库存表Goods

字段名        数据类型        长度

商品名        VARCHAR               14

商品描述              VARCHAR               16

商品库存              SMALLINT                2

主键为:商品名

l  进销表InOutGoods

字段名        数据类型        长度

进销                              VARCHAR                  2

商品名称              VARCHAR                14

商品数量              SMALLINT                2

商品价格              MONEY                   8

操作人员              VARCHAR                 8

操作时间              DATETIME                       8

主键为:(操作人员,操作时间)

    外键为:操作人员,对应于Users表的用户名

4     ADO事务控制应用〈〈商品库存管理〉〉在VB中的实现

4.1  数据环境设计器

           

图1 数据环境设计器

数据环境设计器中主要控件的属性如下:

控件名        控件类型        重要属性设置

CN                   ADOConnection对象    ConnectSource如下:

Provider=SQLOLEDB.1;Password=SA;Persist Security Info=True;User ID=sa;

Initial Catalog=GoodsManagement

     Goods                 ADOCommand对象   ConnectionName:CN 

CommandText:Goods

InOutGoods            ADOCommand对象      ConnectionName:CN  

CommandText:Goods

StrSQL                ADOCommand对象      ConnectionName:CN 

CommandText:Goods

4.2  进库管理模块的代码 

下面就以其中的一个程序段“进库管理”来说明ADO数据对象如何实现事务管理。

 Dim intNum1, intNum2 As Integer

  ¼

  ‘开始一个事务

DE.Cn.BeginTrans

With DE.rsInOutGoods

‘写入购进商品的记录

.AddNew

.Fields(0).Value = "进"

.Fields(1).Value = TxtName.Text

.Fields(2).Value = CInt(TxtNumber.Text)

.Fields(3).Value = CInt(TxtPrice.Text)

.Fields(4).Value = G_userName

.Fields(5).Value = CStr(Now)

.                 .Update

End With

If DE.rsStrSQL.State = adStateOpen Then

DE.rsStrSQL.Close

End If

‘求进销表中商品名为TxtNumber.Text且为进的所有记录的进货数量之和

With DE.rsStrSQL

.Open "select sum(商品数量) from InOutGoods  where 进销='进'" & " and 商品名称='" & TxtName.Text & "'"

intNum1 = .Fields(0).Value

.Close

End With

‘求进销表中商品名为TxtName.Text且为销的所有记录的进货数量之和

With DE.rsStrSQL

.Open "select sum(商品数量) from InOutGoods  where 进销='销'" & " and

商品名称='" & TxtName.Text & "'"

If .RecordCount = 1 And IsNull(.Fields(0).Value) Then

intNum2 = 0

Else

intNum2 = .Fields(0)

End If

.Close

End With

  ‘调整商品库存中该商品的库存量

DE.Cn.Execute "update Goods set 商品库存=" & (intNum1 - intNum2) & " where  商品名='" & TxtName.Text & "'"

 ‘向数据库提交事务

DE.Cn.CommitTrans  

¼

5     ADO事务控制应用〈〈商品库存管理〉〉在DELPHI中的实现

5.1 系统中的数据模块 


                           图2 数据模块窗体

数据模块窗体主要控件的属性如下:

控件名        控件类型        重要属性设置

ADOCn       ADOConnection对象   ConnectSource :(同前)

         ADODatasetGoods     数据集部件ADODataset   ConnectionName:ADOCN  

CommandText:Goods

ADODatasetInOutGoods  数据集部件ADODataset   ConnectionName:ADOCN  

CommandText:Goods

ADODataset1          数据集部件ADODataset    ConnectionName:ADOCN  

CommandText:Goods

DataSourceGoods       DataSource控件       Dataset:ADODatasetGoods

DataSourceInOutGoods  DataSource控件        Dataset:ADODatasetInOutGoods

5.2  进库管理模块的代码

下面就以其中的一个程序段“进库管理”来说明ADO数据对象如何实现事务管理。

var

strSQL:string;

intNum1,intNum2,intRecordsAffected:integer;

begin

¼

//启动事务控制

DM.ADOCn.BeginTrans;

//向进销表插入一条记录

with    DM.ADODataSetInOutGoods do begin

     insert;

    fields[0].Value:='进';

fields[1].Value:= editName.text;

fields[2].AsString:=editNumber.text;

fields[3].AsString:=editPrice.text;

fields[4].Value:=G_UserName;

fields[5].AsString :=DateTimeToStr(now);

Post;

end;

//求进销表中商品名为editName.text且为进的所有记录的进货数量之和

strSQL:='select sum(商品数量) from InOutGoods where  进销=''进''

and  商品名称='''+editName.text+'''';

with DM.ADODataSet1 do begin

Close;

CommandText:=strSQL;

Open;

end;

intNum1:=DM.ADODataSet1.Fields[0].Value ;

//求进销表中商品名为editName.text且为销的所有记录的进货数量之和

strSQL:='select sum(商品数量) from InOutGoods where  进销=''销''

and  商品名称='''+editName.text+'''';

with DM.ADODataSet1 do begin

Close;

CommandText:=strSQL;

Open;

end;

if  (DM.ADODataSet1.RecordCount=1) and

DM.ADODataSet1.Fields[0].Value=null) then

IntNum2:=0

else

intNum2:=DM.ADODataSet1.Fields[0].value;

strSQL:='update Goods set 商品库存='+intToStr(intNum1-intNum2)

+'  where 商品名='''+editName.Text+'''';

DM.ADOCn.Execute (strSQL,intRecordsAffected,[eoExecuteNoRecords]) ;

DM.ADOCn.Execute(strSQL,intRecordsAffected,[eoExecuteNoRecords]) ;

DM.ADOCn.CommitTrans ;

¼

参考文献:

[1](美) Jeffrey P. McManus · Database Access With Visual Basic 6 · 北京 :

机械工业出版社,1999.10

[2] (美) Steven Holzner · Visual Basic 6 Black Book · 北京 :机械工业出版社,1999.4

[3]  莫卫东,白鹏,张晓,张福萍 · Visual Basic 6.0 高级编程技巧----ADO数据访问篇·

西安:西安交通大学出版社,2000.1

[4]  肖永顺,刘韬,李生海,黄军万,黄亮 · DELPHI 程序设计· 北京:人民邮电出版社2000.5

[5]  房增华,徐远超 · Delphi 5 数据库编程实战与精通 · 北京:清华大学出版社2000.7

The  Application of the ActiveX Data Objects transaction control in Visual Basic & DELPHI

MA Gen-feng   SUN Yan  SONG Wei

Abstract     Transaction control is one of the key technology in the database application system. Firstly, the thesis give  a  brief introduction to the  conception of the transaction control and the ADO transaction control of Microsoft, then it shows how to use the transaction control in VB & DELPHI by a illustration。

Key words   ActiveX数据对象(ADO);Transaction control;VB;DELPHI

ActiveX数据对象之事务控制在VB和DELPHI中的应用相关推荐

  1. Spring中的事务控制

    Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 1.1. 有关事务(Transaction)的 ...

  2. Spring中的事务控制(Transacion Management with Spring)

    1.1. 有关事务(Transaction)的楔子 1.1.1. 认识事务本身1.1.2. 初识事务家族成员 1.2. 群雄逐鹿下的Java事务管理 1.2.1. Java平台的局部事务支持1.2.2 ...

  3. 服务数据对象简介(Java 环境中的下一代数据编程)

    如果您认为 J2EE 编程模型和 API 迫使开发人员在特定于技术的配置.编程和调试上浪费了太多的时间,那么欢迎您阅读本文.很多 Java™ 开发人员都怀疑如何能以统一的方式访问异构的数据,并对各种提 ...

  4. 对象类型数据和对象实例数据_服务数据对象简介

    简而言之,SDO是用于数据应用程序开发的框架,其中包括体系结构和API. SDO执行以下操作: 简化J2EE数据编程模型 在面向服务的体系结构(SOA)中抽象数据 统一数据应用程序开发 支持和集成XM ...

  5. [转载]服务数据对象简介

    服务数据对象简介 如果您认为 J2EE 编程模型和 API 迫使开发人员在特定于技术的配置.编程和调试上浪费了太多的时间,那么欢迎您阅读本文.很多 Java™ 开发人员都怀疑如何能以统一的方式访问异构 ...

  6. Spring中的事务控制学习中(转)

    1.1. 有关事务(Transaction)的楔子 1.1.1. 认识事务本身 1.1.2. 初识事务家族成员 1.2. 群雄逐鹿下的Java事务管理 1.2.1. Java平台的局部事务支持 1.2 ...

  7. Spring中的事务控制学习中

    Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 事务管理(Transaction Manage ...

  8. t-sql中的事务控制及错误处理

    ------------------------------------------------事务控制------------------------------------------------ ...

  9. php mysql 嫦娥,介绍MySQL和JDBC的事务控制(TCL)

    文章目录一.MySQL的事务控制(Transaction Control Language) (1)事务的特性(ACID) (2)MySQL的事务控制 (3)mysql事务演示 二.JDBC的事务控制 ...

最新文章

  1. Python学习笔记(5)——使用list和tuple
  2. Windows服务安装、卸载方法,卸载后在服务列表中仍显示问题,指定的服务已经标记为删除
  3. 在让元宇宙“圆梦”这条路上,交互技术卡在哪里了?
  4. sqlmap报错注入
  5. Spring容器初始化实现V3 版本
  6. java 基础知识部分提炼
  7. windows中 修改某种文件图标 的方法 (备忘)
  8. 一款“灵动”的滑动按钮
  9. zookeeper应用 - FIFO 队列 分布式队列
  10. 安装cx_Oracle 遇到的杂项问题
  11. perl语言linux培训,一文了解Perl语言
  12. 阿里巴巴优酷视频增强和超分辨率挑战赛-持续更新
  13. TOPSIS法 —— python
  14. onlyoffice源码编译环境搭建破解
  15. 一群人在网上直播自己怎么写代码,而且还有人爱看
  16. 为你的企业建立竞争情报系统 (转)
  17. 90后在虚拟世界建国风园林,完美融合数字艺术与传统诗词
  18. java局域网组建与维护题_19903-局域网组建与维护-习题答案
  19. 你觉得自己牛逼在哪儿?
  20. 蓝桥杯练习题十四 - 次数差(c++)

热门文章

  1. Hibernate学习(七)
  2. 课堂笔记| 第七章:多态
  3. 62. 如何通过增强(Enhancement) 的方式给 SAP ABAP 标准程序增添新功能
  4. Kotlin学习(一):Kotlin基础知识
  5. AlarmManager与PendingIntent
  6. 质子交换膜燃料电池建模与控制研究
  7. 360掐架搜狗浏览器
  8. 《聊天机器人观后感》
  9. signature=1e5c9cadfac910b9cd55ef06301b71df,Vision-based process control in layered manufacturing
  10. 【练习题】python列表练习题1