如果不使用事务,则无此现象.困惑啊!(100分)

  • 主题发起人 主题发起人 阿器
  • 开始时间 开始时间

阿器

Unregistered / Unconfirmed
GUEST, unregistred user!
想要将tbl-in-voucher的数据转入历史表中tbl-in-voucher-history,附上代码.

现象:insert tbl-in-voucher-history语句似乎不起作用,但delete却毫不客气
的将tbl-in-voucher的数据删除了.如果不使用事务,则无此现象.困惑啊!

adoconnection1的isolationlevel的值使用的缺省值:ilCursorStability

代码如下:
procedure Tf_room.Button1Click(Sender: TObject);
var
time1:string;
time2:string;
begin
if messagedlg('确实将数据转入历史表中吗',mtconfirmation,[mbyes,mbno],0)=mryes then
begin
time1 := datetimetostr(datetimepicker1.DateTime);
time2 := datetimetostr(datetimepicker2.DateTime);

try
dm.DataModule1.ADOConnection1.BeginTrans ;

with dm.DataModule1.qry_tem do
begin
close;
sql.Clear ;
sql.Add (' insert tbl_in_voucher_history ');
sql.Add (' select * from tbl_in_voucher ');
sql.Add (' where in_date between '+''''+time1+'''');
sql.Add (' and '+''''+time2+'''');
// showmessage(sql.text);

try
execsql;
except
raise ;
end;

close;
sql.Clear ;
sql.Add (' delete tbl_in_voucher ');
sql.Add (' where in_date between '+''''+time1+'''');
sql.Add (' and '+''''+time2+'''');
// showmessage(sql.text);

try
execsql;
except
raise ;
end;

end;

//正常
dm.DataModule1.ADOConnection1.CommitTrans ;
except
//异常
dm.DataModule1.ADOConnection1.RollbackTrans ;
showmessage('发生异常,事务回退');
end;
end;
end;
 
insert的时候出错,但你用try跳过了,而delete语句是正确的,最后提交事务,当然delete
正常,你把嵌套的try处理去掉,应该就正常了。内层的try把错误屏蔽掉了,外层的try检测
不到错误,就不会回滚事务,而是提交事务
 
把你的INSERT拿出来单独执行一下,看看对不对.
 
与追命兄的看法一致,应该是由于插入时有异常,开启事务后不能正常结束所之
 
追命兄:
我用单步执行时,眼睁睁地看着它一步一步地正常结束(未触发异常).此时用isqlw
查看表中数据时,tbl-in-voucher-history中的数据没有通过insert加入,而delete却把tbl-in-voucher中的数据删除了.注意:是正常结束.

我将嵌套的try去掉后,仍然不行,数据未转到历史表中(tbl-in-voucher-history)

但是我将有关事务方面的语句注释掉,则insert和delete语句达到预想效果.
(这说明insert和delete语句没有问题.)


to 笑傲江湖:
insert单独应该没有问题,因为我将有关事务的语句注释掉之后,insert和delete
工作正常.


to hbzh1014:
不管是否有异常,事务应该正常结束了,因为正常时有committrans,异常时有
rollstrans.现在的问题是,<font size=5 color=red >在正常运行的情况下
,insert未起作用.</font><font size=6 color=blue >如果不使用事务,则insert
和delete达到预想效果.</font>
 
把这两条SQL掉换先后位置再测试一下(我知道这肯定不是你要的)
即先DELETE后INSERT

 
我认为在这种情况下没有必要使用事务。我感觉在这里使用事务是多余的。
 
to fasto:
如果不使用事务,如在delete时发生的异常,insert语句将使表中出现多余的数据,使历史表
中数据不准确.

to 笑傲江湖:
i try

 
如果对于上面的数据处理,在一个存储过程中解决是一种比较好的方案
 
agree boyman disatree fstao
问题似乎比较奇怪,修改你adoconn的各项参数看看,应该是很常用的功能。

看看去掉delete,有没有insert进去。
 
不太可能,我经常用Tadodataset和Tadocommand写sql语句,根本没有用到事务,没有任何
问题啊?
 
只能说一下和你的问题无关的东西了
try
execsql;
except
raise ;
end;
和单独的
execsql 是一样的效果。
如果execsql出错,进入except,又简单的raise了,所以和单独一行 execsql 是一样的效果

不知道你的 query 的 ExecuteOption 会不会有什么特殊?不会在服务器上
执行的时候先执行了后面的命令然后才执行前面的命令吧?
insert和delete不用同一个TADOquery控件看看?
 
如果照以上所说的没有出现异常的话看看 insert 语句中的条件部分是否不满足?
不会有这样的低级错误吧?而且不用写嵌套的try。
 
这样的业务可以考虑移植到存储过程里,不论是速度还是事务管理都要好得多。
 
tbl-in-voucher-history表上有什么trigger在作用没有?
 
to lipingcool:
没有trigger

感谢各位网友.但结果会是什麽呢?
 
多人接受答案了。
 
后退
顶部