收录日期:2019/07/17 12:58:04 时间: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;注释就好了。

本菜鸟 求一个效果 高手帮帮忙哩!求属性列表控件 最好是ActiveX控件 asp有代码可直接修改系统日期吗? 我的VSS怎么老是安装不了? SessionBean和javabean的区别 unix下,java 能否实现与客户端的域socket通讯?能的话,如何实现?请大虾们赐教! js或vbs有代码可直接修改系统日期吗? directshow怎么入门?下载了sdk.打开里面的一些工程.有的工程完全找不到入口函数.好像没有一些顺序可言.(高分请教) 如何判断treeview没有选中任何节点 datagridview没有选中任何行 菜鸟问题,加急!关于CString的 关于图片上传的方法 请问怎样将数据变为文件形式保存到硬盘上? frameset的HREF的问题 救人啊 请帮看一段程序,是实现什么功能,谢谢! 中断函数和printk() name属性为数字。。。 散分了定者有分!为什么 ccc = dataGrid1.TableStyles[\"temp_1\"];返回空对象 如何将ASCII码值转换为对应的字符 关于file_get_contents采集的内容输出的问题 散分了定者有分!为什么 ccc = dataGrid1.TableStyles[\"temp_1\"];返回空对象 如何在web里实现截屏功能啊?? 我家宝贝离婚了,散分庆祝一下 我調用Dephi 寫的CGI出現下面錯誤是什麼意思?謝謝!! TreeView 中加checkbox 实行多选 怎么解决 在线等 急问关于多文件上传的问题 求wince文件操作的api函数 我調用Dephi 寫的CGI出現下面錯誤是什麼意思?謝謝!! 请网络编程高手进来指教!!!!!!!!! 俺卖30元一个,第一个客户才给20,结果俺不卖!!!!