iNo:=1;
j:=1;
iAllCount:=500000;
try
  database1.StartTransaction ;
  table1.DatabaseName:=database1.DatabaseName ;
  table1.CachedUpdates:=True;
  table1.Active :=true;
  while (j<=iAllCount) do
  begin
    iNo:=iNo+1;
    table1.Append;
    table1.FieldByName('N_NO').asinteger:=iNO;
    .......
    j:=j+1;
  end;
  //table1.Post;
  table1.ApplyUpdates;   //写入数据库
  database1.Commit ;
  except
    on e:Exception do
      begin
        database1.Rollback ;
        exit;
      end;
  end;
  table1.CommitUpdates; //写入成功后,清除数据库缓存
  
  问:1、设置了CachedUpdates:=True;对post来说失效了吗?必须用Commit提交?
      2、对于50000数据,能不能每1000条写数据库一次,只要在50次中有一次失败,数据库回滚。用事务如何实现?
      3、不用table控件还有其他更好的方法?
  敬请高手指点。分不够可再加。  

解决方案 »

  1.   

    最好用ADOQUERY 或者QUERY控件!
      

  2.   

    用ADOQuery采用缓存更新,打开Prepared属性,要更新的每一条记录都生成Insert语句并且Add到ADOQuery的SQL里去。每隔800条UpdateBatch一次。
      

  3.   

    我用BDE连接数据库,是不是只能用ApplyUpdate?如果用Query+缓存+事务,insert 后不用Query.excesql? 有个小例子最好。谢先
      

  4.   

    数据量大就别用Table,改用Query这样会快些
      

  5.   

    首先最好不要用绑定,这种方式不适合做商业程序.用StringGrid或Listview 来显示,你想想一次显示最多有1000条,都足够用户看了,没有必要一次将所有的都显示出来,每次只显示一个合理的用户数量.要想大批量的修改数据,介意你还是用SQL语句来完成,如果数据库支持存储过程最好用存储过程完成,在和多线程想结合就不会锁定界面了.如果你在修改过去的程序,仔细计划一下是不是在实现方式上应做重要修改了.如果是新的程序,建议你用ADO,将数据操作和界面显示分开.在数据操作中尽量将操作交给数据库完成,程序只是发出命令不去具体的操作每一个字段.
      

  6.   

    数据集.first;
    for i:=1 to 记录总数 do
    begin
      try
        if i mod 500=1 then
          beginTrans;//启动事务
        数据集.UpdateBatch(arCurrent);//提交当前缓存
        if i mod 500=1 then
          commitTrans;//提交事务
      except
        //回滚事务 
      end;
    end;
     if 事务处于启动状态 then
      try
        commitTrans;//提交事务
      except
        //回滚事务 
      end;