这种效果不知道是不是叫钩子了,用delphi怎么实现? ( 积分: 50 )

  • 主题发起人 主题发起人 月满C楼
  • 开始时间 开始时间

月满C楼

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TfmeEvtReg.SaveInsert();
begin
////////////////////////////////
代码块A

////////////////////////////////

代码块B
///////////////////////////////

//效果要求如下
//在整个程序代码的执行过程中,一但遇到错误就取消所有的执行
//就像数据库的事务一样,要不全部给我执行该过程,要不全部都不执行

//晕,有点不太可能,因为代码块A和代码块B中都有数据库的insert记录
//***********而且是A中插入1条记录,B中就会插入几条(数目确定)记录(数据来自delphi界面)的那种情况*********
//嗯嗯,是个值得琢磨的问题。
end;
 
try
A
B
except 撤销操作代码
 
思路:在Try里正常执行两部分代码,如果正常就提交事务,如果出错就回滚。
try
//在第一个SQL语句前增加一句:
adoqry1.sql.add('begin transaction');
A
B
//成功,埸交事务。要注意对应关系,Commit总是各最近一次Begin Transaction相对应的。
with adoqry1 do
begin
sql.add('Commit');
execsql;
end;
except
//回滚
with adoqry1 do
begin
sql.add('RollBack');
execsql;
end;
end;
只有提交的事务才会更新到数据库,如果只有begin transaction 而没有提交(对不起 提交的关键词只记得样子了,查一下SQL的帮助吧,我的本本上没安装),则数据不会实质更新到数据库,虽然你在进行B操作时,A操作的数据是可见的,但SQL会回滚超时的事务,以及在SQL重启时回滚全部未提交的事务。
 
如果仅仅是指要取消SQL语句的话,直接用sql server里的事务处理即可达到目的。
 
我用的是ODAC,不是ADO;
try
adoqry1.sql.add('begin tran');
adoqry1.sql.add('insert into Tm (''1'',''A'')');
for i:=0 to 6 do
adoqry1.sql.add('insert into Ts (edt.text,''1'',''A'')');
adoqry1.sql.add('commit tran');
adoqry1.execsql;
except
adoqry1.sql.add('rollback tran');
adoqry1.execsql;
end;
你觉得这个行不行??/
 
我功能已经实现,目前正忙,还没尝试你的方法

但是感觉上应该要补充两点,对后台为MSSQL的还应该加上
1.adoqry1.sql.add('set xact_abort on');//否则只回滚失败的DML
2.connection控件的AutoCommit设置为False

有时间测试了再发结果共享
 
后退
顶部