本文发表在中国人民解放军“信息工程大学”学报 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. PL/SQL 一个数据对象一个事务(rollback,submit)

    /*********************************************** 一个数据对象一个事务(且记录错误信息到处理对象) ************************** ...

  2. spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析

    知识点梳理 课堂讲义 1)事务回顾 1.1)什么是事务-视频01 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败. 1.2)事务的作用 事务特征(ACID) 原子 ...

  3. spring入门(三)【事务控制】

    在开发中需要操作数据库,进行增.删.改操作的过程中属于一次操作,如果在一个业务中需要更新多张表,那么任意一张表的更新失败,整个业务的更新就是失败,这时那些更新成功的表必须回滚,否则业务会出错,这时就要 ...

  4. python学习_应用pickle模块封装和拆封数据对象

    学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...

  5. spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    //假设这是一个service类的片段 try{ //出现异常 } catch (Exception e) { e.printStackTrace(); //设置手动回滚 TransactionAsp ...

  6. 大数据学习day35----flume01-------1 agent(关于agent的一些问题),2 event,3 有关agent和event的一些问题,4 transaction(事务控制机制),5 flume安装 6.Flume入门案例

    具体见文档,以下只是简单笔记(内容不全) 1.agent Flume中最核心的角色是agent,flume采集系统就是由一个个agent连接起来所形成的一个或简单或复杂的数据传输通道.对于每一个Age ...

  7. 代码中添加事务控制 VS(数据库存储过程+事务) 保证数据的完整性与一致性

    做人事档案的系统考虑到数据的安全性与一致性,毕竟是要对外上线.真正投入使用的项目,数据库的可靠性与安全性上我们开发人员要考虑的就很多了,记得做机房收费系统时注册新卡是自己为了简单,写成了一个存储过程( ...

  8. PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

    1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面 ...

  9. 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制之 第二部分

    第二部分 尝试解决BulkWrite(List<WriteModel<T>>)问题 在上次发表的文章中,得到了一些很好的反馈,真切体会到写博文的好处,有高人指出两大问题,具体可 ...

随机推荐

  1. linux中 probe函数的何时调用的?

    点击打开链接 linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给p ...

  2. 【伯乐在线】Java线程面试题 Top 50

    本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特 ...

  3. Struts1基础、使用Struts实现登录、使用Struts HTML标签简化开发

    Struts 1基础 为什么重拾Struts 1 曾经是最主流的MVC框架 市场份额依然很大 很多遗留系统中依旧使用 维护和升级都需要熟悉Struts 1 与Struts 2相比 编码.配置繁琐 侵入 ...

  4. JBOSS EAP 6 系列三 Oracle、Mysql数据源的配置(驱动)—认识模块的使用

    本文介绍JBOSS EAP 6.2中Oracle数据源的配置方式.结合之前JBOSS EAP 6.2新功能,本文初识JBOSS模块申明式容器这一特性. 模块申明式容器:JBOSS EAP不再有lib的 ...

  5. Dynamics CRM Plugin DLL恢复工具

    本篇接上篇继续介绍XrmToolBox中的某项功能,该工具的下载见上篇博文. 打开XrmToolBox,找到Assembly Recovery Tool,点击进去 如何连接上你的组织继续不表,列表中显 ...

  6. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  7. Mybatis源码分析之缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  8. Android打包遇到的那些坑

    说说今天打包遇到的坑,由于线上有个支付的bug需要紧急修复,而我们的项目又没有使用热修复,所以只能通过编译打包等传统流程,还好android上线比较快. 说说我进早上打包遇到的几个问题吧,首先我使用b ...

  9. androidpn-client笔记及BUG修改

    这几天应业务需要,在搭建一个推送的DEMO.在参考了许多资料之后,最终使用了androidpn. androidpn分server端和client端.server端几经折腾,最终采用了github上的 ...

  10. android文件混淆详解

    -injars  androidtest.jar[jar包所在地址]  -outjars  out[输出地址] -libraryjars    'D:\android-sdk-windows\plat ...