0

0

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

php中文网

php中文网

发布时间:2016-06-07 16:12:57

|

1255人浏览过

|

来源于php中文网

原创

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

摘要 事务控制是数据库应用系统中的关键技术之一,本文一开始先对事务控制的概念以及微软的 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表的用户名

Flowith
Flowith

一款GPT4驱动的节点式 AI 创作工具

下载

 

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 & "'"

 ‘向数据库提交事务

D【本文来自鸿网互联 (http://www.68idc.cn)】E.Cn.CommitTrans  

?

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

5.1 系统中的数据模块

 

\

 

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

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

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 ;

?

 

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

129

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

77

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

81

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

60

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

444

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

15

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

12

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

5

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.2万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.4万人学习

Git 教程
Git 教程

共21课时 | 2.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号