收录日期:2019/10/21 08:23:48 时间:2016/05/07 06:48:18 标签:VCL组件开发及应用
  我想达到的目的是用一个query(启用cachedupdate)对四个表分别进行新增记录操作,最后通过一个事务,将四个表中的内容进行更新。请看一下我程序的顺序对否,特别是事务一处的,谢谢。

//对四个表操作的四条sql语句//
mysql1:='insert into e_basic  ......
mysql2:='insert into e_pact ......
mysql3:='insert into e_function ......
mysql4:='insert into e_welfare ......

//启动事务//
datamodule1.database1.StartTransaction;

//分别执行sql语句//
with datamodule1.query1 do
begin
sql.clear;
sql.add(mysql1);
execsql;
sql.clear;
sql.add(mysql2);
execsql;
sql.clear;
sql.add(mysql3);
execsql;
sql.clear;
sql.add(mysql4);
execsql;

//进行更新操作//
try
ApplyUpdates;
datamodule1.database1.commit ;
except
datamodule1.database1.rollback;
raise;
end;
commitupdates;
end;
end;
你在使用ApplyUpdates之前有没有做以下操作:
CatchedUpdates:= true;
RequestLive:=False;

datamodule1.database1.StartTransaction;
是不是应在
try
  applyupdates;//..前面
//
  cacheupdate的含义就是用户修改的数据存放在DataSet当中,在需要的时候才保存到数据库,因此你用一个Query对四个表进行CacheUpdate方式的新增记录操作是不行的。
  按照你的情况,可以有两种解决办法:
1、不使用CacheUpdate,则可以这样:
 datamodule1.database1.StartTransaction;
 with datamodule1.query1 do
 begin
  try
   sql.clear;
   sql.add(mysql1);
   execsql;
   sql.clear;
   sql.add(mysql2);
   execsql;
   sql.clear;
   sql.add(mysql3);
   execsql;
   sql.clear;
   sql.add(mysql4);
   execsql;

 except
  datamodule1.database1.rollback;
  raise;
  exit;
 end;
datamodule1.database1.commit ;

end;
end;
2、使用CacheUpdate,那就比较复杂。
i.用四个Query分别对应四个表(sql=select * from e_basic  ...,select * from e_pact ,...),设四个Query分别为query1,query2,query3,query4,将他们的CachedUpdates属性设置为true,RequestLive设置为false.用一个database控件(例如database1)和数据库相连,并且四个query都通过database1和数据库相连。
ii.用四个UpdateSQL控件分别与上面的四个Query相连(将Query的UpdateObject属性设置为对应的UpdateSQL控件);分别在UpdateSQL控件上点右键,打开UpdateSQL editor,然后用Generate SQL按钮生成相应的SQL语句。
iii.程序运行,Query.open连接数据库;修改Query中的数据,这可以用和Query相连的DB控件实现,也可以用Query.FieldByName('...').As...:=的方式实现,我比较倾向前一种方式。
iv.需要保存的时候,调用:
try
 database1.ApplyUpdates([Query1,query2,query3,query4]);
except
 do something...
end;
就会把数据保存到数据库。database.ApplyUpdates当中已经包含了事务处理,不需要另外的事务处理,ApplyUpdates的详细情况可以看Delphi的帮助。
另外,在C:\Program Files\Borland\Delphi5\Help\Examples\Update下面有一个CacheUpdate的例子。
如果有问题继续联系,Good luck.
因为你没有使用QUEYR进行EDIT,而是使用SQL语句直接操作数据库,不存在CATCHEDUPDATE,将ApplyUpdates;注释就好了。

【潇洒】押宝不给力啊! 祝大家元旦快乐!~~~~ WCF做身份验证这么挫吗? 急!!!求助 2010最后一天,挑战高难度问题 求看程序问题,, 错误始终找不出来!!! 2010最后一天,开贴散分。超过10个人回,我就结贴…………2 分页存储过程报错,有高手指点一下吗? 元旦快到了,新年不远了(1) 元旦快到了,新年不远了(2) android模拟器无法联网 datalist读出来的有几个文章标题,怎样设置标题之间的行间距? 仍个蛋 问个问题,那个血管暴涨的帖子呢 元旦快到了,新年不远了(3) PHP创建数据库 c# 中,怎么记录触发的控件 dreamweaver 编辑器没有横向滚动条,怎么设置使它有 【请教】在AS中创建的Panel,如何让其title居中 请问大家研究过opencore的oscl的跨平台吗? 关于delphi xe JSON方便的几个注意事项。 2010最后一天,开贴散分。超过10个人回,我就结贴…………3再来! daytime服务连接超时,我这代码有错误吗? 关于sql语句的问题 Nhi 生成SQL执行效率 问个伪静态传参问题--------------急 学什么技术 在struts2中,jquery的ajax方式提交数据到后台,怎样接收返回的json数据 麻烦各位IT达人门帮帮忙,如何让可编辑DIV里的元素不可删除 system函数的小疑问 未结束的字符串常量