我将ADOConnection.BeginTrans
ADOConnection.CommitTrans
ADOConnection.RollbackTrans
分别在三个函数中书写,然后在程序中使用此三个函数。望大家给予指正,谢谢
代码:
procedure sw_b;//开始事务
begin
if SVRdm.sADOConn.ConnectionString<>'' then
begin
if SVRdm.sAdoconn.Connected=false then SVRdm.sAdoconn.Connected:=true;//重新连接到数据源
SVRdm.sADOConn.BeginTrans;//开始一个事务
if SVRdm.sADOConn.InTransaction<>true then //不为真时,表示没有活动事务
begin
messagebox(MYMSG('FUNCBeginTransERR'),0);//FUNCBeginTransERR=事务开始失败
EXIT;
end
end
else
begin
messagebox(MYMSG('FUNCconnstringisNULL'),0);//FUNCconnstringisNULL=连接字串为空
end
end;procedure sw_C;//提交事务
begin SVRdm.sADOConn.CommitTrans;
if SVRdm.sADOConn.InTransaction<>false then//不为假时,表示还有活动事务
begin
messagebox(MYMSG('FUNCCommitTransERR'),0);//FUNCCommitTransERR=事务提交失败
EXIT;
end
else
begin
// SVRdm.sAdoconn.Connected:=false;//正确操作后,关闭数所源
end
end;procedure sw_R;//回滚事务
begin
SVRdm.sADOConn.RollbackTrans;
if SVRdm.sADOConn.InTransaction<>false then//不为假时,表示还有活动事务
begin
messagebox(MYMSG('FUNCRollbackTransERR'),0);//FUNCRollbackTransERR=事务回滚失败
EXIT;
end
else
begin
// SVRdm.sAdoconn.Connected:=false; //正确操作后,关闭数所源
end
end;调用例子:
sw_b;
if sqlexec(0,'UPDATE 登录表 SET 状态=''ON'',计算机名='''+ComputerName+''' where 用户名='''+loginusename+'''')<0 then
begin
messagebox(MYMSG('FUNCupdateUsenameStatErr'),0);//FUNCupdateUsenameStatErr=更新用户信息失败,请检查。
sw_r;
end
else
begin
sw_c;
end;
ADOConnection.CommitTrans
ADOConnection.RollbackTrans
分别在三个函数中书写,然后在程序中使用此三个函数。望大家给予指正,谢谢
代码:
procedure sw_b;//开始事务
begin
if SVRdm.sADOConn.ConnectionString<>'' then
begin
if SVRdm.sAdoconn.Connected=false then SVRdm.sAdoconn.Connected:=true;//重新连接到数据源
SVRdm.sADOConn.BeginTrans;//开始一个事务
if SVRdm.sADOConn.InTransaction<>true then //不为真时,表示没有活动事务
begin
messagebox(MYMSG('FUNCBeginTransERR'),0);//FUNCBeginTransERR=事务开始失败
EXIT;
end
end
else
begin
messagebox(MYMSG('FUNCconnstringisNULL'),0);//FUNCconnstringisNULL=连接字串为空
end
end;procedure sw_C;//提交事务
begin SVRdm.sADOConn.CommitTrans;
if SVRdm.sADOConn.InTransaction<>false then//不为假时,表示还有活动事务
begin
messagebox(MYMSG('FUNCCommitTransERR'),0);//FUNCCommitTransERR=事务提交失败
EXIT;
end
else
begin
// SVRdm.sAdoconn.Connected:=false;//正确操作后,关闭数所源
end
end;procedure sw_R;//回滚事务
begin
SVRdm.sADOConn.RollbackTrans;
if SVRdm.sADOConn.InTransaction<>false then//不为假时,表示还有活动事务
begin
messagebox(MYMSG('FUNCRollbackTransERR'),0);//FUNCRollbackTransERR=事务回滚失败
EXIT;
end
else
begin
// SVRdm.sAdoconn.Connected:=false; //正确操作后,关闭数所源
end
end;调用例子:
sw_b;
if sqlexec(0,'UPDATE 登录表 SET 状态=''ON'',计算机名='''+ComputerName+''' where 用户名='''+loginusename+'''')<0 then
begin
messagebox(MYMSG('FUNCupdateUsenameStatErr'),0);//FUNCupdateUsenameStatErr=更新用户信息失败,请检查。
sw_r;
end
else
begin
sw_c;
end;
解决方案 »
- 急急急!求救
- 多层分布式中间件QuickBurro发布V3.3版本,开始支持Delphi2010
- delphi rave报表中人民币金额转大写(access 数据库)(大哥大姐帮帮忙)
- 辽宁北软沈阳分公司于2007/1/16日开张,急聘delphi项目经理、工程师
- 用过JabberCOM的高手请进!顶者有分!
- 请问:如何把WebBrowser控件的3D框架变成无以及把它的背景变成透明等?
- AdvStringGrid怎么注册啊?
- 高手请:如何连接本地数据表?
- 斑竹,为何"搜索"功能不能用,急啊!!!!!!!!!!
- 一个关于时间转换的问题!!
- Delphi是属于面向对象的开发软件吗?
- dbtext与sql表的联接,请帮手,TKS!
ADOConnection.BeginTrans
try
...
ADOConnection.CommitTrans
except
ADOConnection.RollbackTrans
end;但我觉得对程序给维护带来了不便,不知道能否帮我纠正一下上面的函数,谢谢。
type
IDataService=interface
procedure begintrans;
procedure CommitTrans;
procedure RollBackTrans;
end; TBdeDS = class(TInterfacedObject,IDataService)
procedure begintrans;
procedure CommitTrans;
procedure RollBackTrans;
end; TAdoDS = class(TInterfacedObject,IDataService)
procedure begintrans;
procedure CommitTrans;
procedure RollBackTrans;
end;实现之...然后在应用的时候,你只需要根据你系统的访问特性来生成一个ds 例如
MyDs := TAdoDs.Create;或者 MyDs:=TBdeDS.create;//需要修改的只是这句
在你的应用中就可以
MyDs.BeginTrans;
....
MyDs.CommitTrans;
except
MyDs.RollbackTrans;
MyDs.BeginTrans;
....
MyDs.CommitTrans;
except
MyDs.RollbackTrans;
都不用改,并且比你封装的方法可以重用,简单说就是应用代码只需要一个IDataService接口就ok了,不管这个接口是bde还是ado提供的,也不需要让应用代码知道这些细节,
例如:
sw_b;
if sqlexec(0,'UPDATE 登录表 SET 状态=''ON'',计算机名='''+ComputerName+''' where 用户名='''+loginusename+'''')<0 then
begin
messagebox(MYMSG('FUNCupdateUsenameStatErr'),0);//更新用户信息失败,请检查。
sw_r;
end
else
begin
sw_c;
end;
type TProc = procedure of Object; IDataServicePlus = interface(IDataService)
procedure Update(UpdateProc:TProc );
end; TBdeDs = class(TInterfacedobject,IDataservicePlus)
procedure Update(UpdateProc:TProc );
end; Txxx = class
private
procedure updateData;
procedure doUpdateData;
end;procedure TXxx.doUpdateData;
begin
Table1.Post;//可以有多行代码
end;procedure TXxx.UpdateData;
begin
MyDs.update(doUpdateData);
end;//必须将每个更新都封装在一个函数里,并将该函数传入DataService,用其服务来更新,但是这样感觉代码更麻烦了,不是吗?proceudre TBdeDs.Update(UpdateProc:TProc );
begin
Begintrans;
try
UpdateProc;
CommitTrans;
except
RollbackTrans;
end;
end;
其实我的思路是这样的:
1.在开始更新、删除、插入时就开始一个事务(ADOConnection.BeginTrans)
2.判断SQL语句是否执行成功,如果成功则提交一个事务(ADOConnection.CommitTrans)
3.反之则回滚一个事务(ADOConnection.RollbackTrans)注:判断SQL语句是否执行成功的函数代码:
function sqlexec(openORExecSQL:integer;sqlstr:string):integer;//SQL语句执行函数
{retuinfo 等于0时不返回结果集,大于0时,返回结果集
sqlstr为要执行的SQL语句}
begin
{执行SQL语句}
SVRdm.sCreadata.close; //关闭之前查询
SVRdm.sCreadata.SQL.clear;//清空SQL语句
try
SVRdm.sCreadata.sql.Add(sqlstr);
if openORExecSQL=0 then
begin
SVRdm.sCreadata.ExecSQL; //不返回结果集
end
else
begin
if not SVRdm.sCreadata.Prepared then //当不为真时
begin
SVRdm.sCreadata.Prepared:=true; //为真时,为查询作第一次准备,以回快查询速度。
SVRdm.sCreadata.open; //返回结果集
end
else
begin
SVRdm.sCreadata.open; //返回结果集
end
end;
result:=1; //返回大于0的值
except
result:=-1; //当出现错误返回小于0的值
end;
end;