ActiveX数据对象之事务控制在VB和DELPHI中的应用
本文发表在中国人民解放军“信息工程大学”学报 2001年第3期。
ActiveX数据对象之事务控制在VB和DELPHI中的应用
马根峰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中的应用的更多相关文章
- PL/SQL 一个数据对象一个事务(rollback,submit)
/*********************************************** 一个数据对象一个事务(且记录错误信息到处理对象) ************************** ...
- spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析
知识点梳理 课堂讲义 1)事务回顾 1.1)什么是事务-视频01 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败. 1.2)事务的作用 事务特征(ACID) 原子 ...
- spring入门(三)【事务控制】
在开发中需要操作数据库,进行增.删.改操作的过程中属于一次操作,如果在一个业务中需要更新多张表,那么任意一张表的更新失败,整个业务的更新就是失败,这时那些更新成功的表必须回滚,否则业务会出错,这时就要 ...
- python学习_应用pickle模块封装和拆封数据对象
学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...
- spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//假设这是一个service类的片段 try{ //出现异常 } catch (Exception e) { e.printStackTrace(); //设置手动回滚 TransactionAsp ...
- 大数据学习day35----flume01-------1 agent(关于agent的一些问题),2 event,3 有关agent和event的一些问题,4 transaction(事务控制机制),5 flume安装 6.Flume入门案例
具体见文档,以下只是简单笔记(内容不全) 1.agent Flume中最核心的角色是agent,flume采集系统就是由一个个agent连接起来所形成的一个或简单或复杂的数据传输通道.对于每一个Age ...
- 代码中添加事务控制 VS(数据库存储过程+事务) 保证数据的完整性与一致性
做人事档案的系统考虑到数据的安全性与一致性,毕竟是要对外上线.真正投入使用的项目,数据库的可靠性与安全性上我们开发人员要考虑的就很多了,记得做机房收费系统时注册新卡是自己为了简单,写成了一个存储过程( ...
- PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)
1.和mysql扩展库的区别: (1 安全性.稳定性更高 (2 提供了面向对象和面向过程两种风格 2.php.ini 中的 extension=php_mysqli.dll 解除封印 3.面 ...
- 看门外汉如何实现:C#操作 MongoDB基本CURD的事务控制之 第二部分
第二部分 尝试解决BulkWrite(List<WriteModel<T>>)问题 在上次发表的文章中,得到了一些很好的反馈,真切体会到写博文的好处,有高人指出两大问题,具体可 ...
随机推荐
- EJB_开发单表映射的实体bean
开发单表映射的实体bean 实体bean 它属于java持久化规范(JPA)里的技术,实体bean通过元数据在Javabean和数据库表之间建立起映射关系,然后Java程序员就可以随心所欲的使用面向对 ...
- 内存数据网格IMDG简介
1 简介 将内存作为首要存储介质不是什么新鲜事儿,我们身边有很多主存数据库(IMDB或MMDB)的例子.在对主存的使用上,内存数据网格(In Memory Data Grid,IMDG)与IMDB类似 ...
- JavaScript与jQuery获取相邻控件
原始代码如下,需求是onclick中的OpenIframe方法捕捉到input中的value值,由于某些限制无法使用正常的操作dom根据name值来取,所以决定通过相邻空间的方式获取 <div& ...
- Android开发中StackOverflowError
Android开发中StackOverflowError错误实例分析 一.概述 我在一个复杂的layout嵌套较多的android界面,碰到了java.lang.StackOverflowError这 ...
- HTML5中 HTML列表/块/布局 韩俊强的博客
从简单到复杂HTML5详解:每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 1.HTML列表 1.有序 2.无序 3.有序star属性 4.有序无序列表 代码: ...
- 【Unity Shaders】Vertex Magic —— 访问顶点颜色
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- Objc中触摸处理阻塞时消息派送的问题
在游戏场景中添加了touchBegan的处理: -(void)touchBegan:(CCTouch *)touch withEvent:(CCTouchEvent *)event{ if ([sel ...
- Android列表视图ListView和ListActivity-android学习之旅(二十四)
ListView简介 ListView是android中常用的一种控件,创建ListView有两种方式: 1.在xml中使用ListView控件创建. 2.使用activity继承ListActivi ...
- 07_NoSQL数据库之Redis数据库:Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存
事务处理 Redis对事务的支持目前还比较简单.Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令.当一个client在一个连接中发出mul ...
- Android:android sdk源码中怎么没有httpclient的源码了
欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 今天想使用这个API,怎么也找不到.废了好多时间... 查阅资料才知道如下解释: 在android 6.0(API 23)中,G ...