你在使用ApplyUpdates之前有没有做以下操作:
CatchedUpdates:= true;
RequestLive:=False;datamodule1.database1.StartTransaction;
是不是应在
try
  applyupdates;//..前面
//

解决方案 »

  1.   

      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.
      

  2.   

    因为你没有使用QUEYR进行EDIT,而是使用SQL语句直接操作数据库,不存在CATCHEDUPDATE,将ApplyUpdates;注释就好了。