我是在中间层执行事务的,中间层用的是ODAC连接ORACLE(一个OraSession1,一个OraTable1,OraTable2,OraTable3,一个OraProvider1控件)我的事务是:有一个主表table1,两个从表table2,table3。当主表append一条记录时,两个从表也相应的插入一条记录,并把主表的ID写为自己的ID。如果出错了,那么就谁都不插入。我是在数据表OraTable1控件的BeforeInsert事件中激活事务的,不知是不是应该这样。我的程序如下:begin
OraSession1.StartTransaction; //开始事务;
try
OraTable2.Append;
OraTable2.FieldValues['id']:=OraTable1.Fields[0].AsInteger;
OraTable2.Post;
OraTable3.Append;
OraTable3.FieldValues['id']:=OraTable1.Fields[0].AsInteger;
OraTable3.Post;
except
OraSession1.Rollback; //出错则回滚
OraTable1.CancelUpdates;//主表本身也取消插入
exit;
end;
OraSession1.Commit; //提交。结果是OraTable1表插入了记录,而另外两个表则没有相应的插入记录,就好象这段程序根本没有执行。
在这个事件中执行事务应该没有错吧?这里哪出错了呢?
OraSession1.StartTransaction; //开始事务;
try
OraTable2.Append;
OraTable2.FieldValues['id']:=OraTable1.Fields[0].AsInteger;
OraTable2.Post;
OraTable3.Append;
OraTable3.FieldValues['id']:=OraTable1.Fields[0].AsInteger;
OraTable3.Post;
except
OraSession1.Rollback; //出错则回滚
OraTable1.CancelUpdates;//主表本身也取消插入
exit;
end;
OraSession1.Commit; //提交。结果是OraTable1表插入了记录,而另外两个表则没有相应的插入记录,就好象这段程序根本没有执行。
在这个事件中执行事务应该没有错吧?这里哪出错了呢?
解决方案 »
- delphi 再次提问socket.sendBuf()和socket.ReceiveBuf()发送与接收并显示二进制的问题
- 如何将数据库中的流文件传递给pdf控件?
- 请教:如何做二次查询?Delphi + ADO + Sql server
- 急救!怎样通过QuickRep控件把打印结果输出为HTML格式?
- 招聘Delphi程序员(江苏,太仓)
- Case 语句要怎么用??
- 急呀,兄弟,帮帮忙,好吗?
- 急!!!用Query如何调用系统存储过程Sp_help!
- 哪位大虾有用delphi编写的邮件程序 ?(快来看)
- Win7标准用户怎么在桌面创建文件夹
- 请各位大虾帮忙 ADOquery中一个批量处理问题
- 截屏问题
clientdataset1.append;
clientdataset1.fieldbyname('id').asinteger:=1;
clientdataset1.applyupdatas(0);
全部,将APPEND EDIT;什么的 改成SQL语句来完成
begin
OraTable2.Append;
OraTable2.FieldValues['id']:=OraTable1.Fields[0].AsInteger;
OraTable2.Post;
OraTable3.Append;
OraTable3.FieldValues['id']:=OraTable1.Fields[0].AsInteger;
OraTable3.Post;
end; 如果其中出错则会全部回滚
但是我只在插入时使用事务,平时提交保存不用事务啊!
table1.fieldvalues['字段2']:=DeltaDS.FieldValues['字段2'];
table1.fieldvalues['字段3']:=DeltaDS.FieldValues['字段3'];
......
不会这样麻烦吧?
另外应该在AFTERUPDATERECORD中写对子表的动作;在BEFOREUPDATERECORD中的APPLIED如是设为TRUE ,,provider 将不再负责这条记录的更新;
这表示你已经自已处理了这条记录的更新;