代码中adoquery3的数据源为sql sever,adoquery1的数据源为oracle,分别连接两个字段名和顺序相同的表,程序的目的是让两个数据库中的表同步。每次对sql server的中表进行数据变更,之后复制到oracle中。
try            adoquery3.Filtered := false;
            showmessage(inttostr(adoquery3.RecordCount));//这儿MESSAGEBOX显示adoquery3的行数为7行,说明adoquery3中有数据。
            adoquery3.Clone(adoquery1,ltbatchOptimistic);
            showmessage(inttostr(adoquery1.RecordCount));//这个MESSAGEBOX显示adoquery1的行数为0行,说明clone没有成功。
            adoconnection1.BeginTrans;
            adoconnection3.BeginTrans;
            adoquery1.UpdateBatch;
            adoquery3.UpdateBatch;
            adoconnection1.CommitTrans;
            adoconnection3.CommitTrans;
        except
             {adoquery1.CancelUpdates;}
            showmessage('导入失败!请核实后重新导入!');
            adoquery1.CancelBatch;
            adoquery3.CancelBatch;
            adoconnection1.RollbackTrans;
            adoconnection3.RollbackTrans;
            Abort;
            raise;
        end;请大虾们帮帮忙啊

解决方案 »

  1.   

    1、clone的时候不但clone数据,环境也clone,即连接信息也被复制了,你的ADOQuery1克隆到AOQuery2后,ADOQuery2的连接信息就与ADOQuery1一样了,ADOQuery2根本不可能再向第二连接数据库传送数据 
       2、就算能传送数据,记录必须处于修改、删除、新增的状态才能用UpdateBatch(arAll);回写入数据库。 
       3、 如果你使用的是sqlserver数据库,建议使用opensource进行数据库数据复制,否则就只能一条一条的插入
      

  2.   

    没有测试,问问 clone 后不用重新查询一下吗?你的查询是live模式的可以自动回送数据?
      

  3.   

    1楼说的有一定道理,但是既然是所以有属性全clone过来,我在没有提交之前的recordconut应该是有数据的,只是在提交之后不能写入oracle数据库。另外我也试了,adoquery3.recordset := adoquery1.recordset也不行。难道只有用循环一条条地插入吗?这个表的字段奇多………………
      

  4.   

    既然表结构完全相同,可以用for i:=0 to Field.count-1 do
       Source.Fields[i].Value := Dest.Fields[i].Value;