两个adoquery数据如何互相导入?

linlingwei 2018-01-28 10:06:09
由于项目的特殊性,没法用sql的存储过程远程直连数据库,只能用两个adoquery,一个连接远程表,一个连接本地表。
adoquery1.sql.text:='select id,the_name,the_date from aa'; //远程表
adoquery2.sql.text:='select id,the_name,the_date from bb ';//本地表
想做的功能就是:以远程表为参考,本地没有的id,从远程表插入到本地;本地有的,如果the_date早于远程表,就用远程表
的the_name更新本地表。
不要用下面方法:
with adoquerey do
begin
first;
while not eof do
....
因为远程表有数万条数据,这个方法能实现,但是效率太低。
各位有没有其他的方法?
...全文
1735 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
DelphixpeFan 2018-02-14
  • 打赏
  • 举报
回复
没加Insert或者append,当然不能复制
秋天之落叶 2018-02-13
  • 打赏
  • 举报
回复
引用 4 楼 lyhoo163 的回复:
五、精细复制

begin
  with ADOQueryA.DataSource.DataSet do
  begin
    First;
    while Not Eof do Delete;
  end;
  with ADOQueryB.DataSource.DataSet do
  begin
    First;
    while Not Eof do
    begin
      ADOQueryA.DataSource.DataSet.FieldByName('AAA'):=FieldByName('AAA');
      ADOQueryA.DataSource.DataSet.FieldByName('BBB'):=FieldByName('BBB');
      ADOQueryA.DataSource.DataSet.FieldByName('CCC'):=FieldByName('CCC');
      ......     
      Next; 
    end;
  end;
end;
无法编译,加上Value运行提示read错误。
zbdzjx 2018-02-13
  • 打赏
  • 举报
回复
换个角度来解决。 在本地建个临时表,将远程的表数据全部插入到临时表,再按要求处理。
秋天之落叶 2018-02-13
  • 打赏
  • 举报
回复
引用 4 楼 lyhoo163 的回复:
如果全部数据复制,且表结构一致。 二、全部复制

adoquery1.Recordset:=adoquery1.Recordset;
三、克隆

adoquery1.Recordset:=adoquery1.Recordset.clone(Tlocktype); 
or:
ADODataSet2.Clone(ADODataSet1) 
结贴请教一下,我曾这样用过ADOQuery2 := ADOQuery1,和你说的二三有什么区别吗? 使用中1和2是同步的,源1关闭了2也就不能用了。
秋天之落叶 2018-02-13
  • 打赏
  • 举报
回复
引用 8 楼 lyhoo163 的回复:
二、三是复制了数据。 ADOQuery2 := ADOQuery1,控件的指定(转换),数据并未复制,还是的数据。 精细复制,要修改“字段名”一致,才能复制。
哦,看来是我理解错误了,一直把ADOQuery当成数据集了,多谢。
lyhoo163 2018-02-13
  • 打赏
  • 举报
回复
二、三是复制了数据。 ADOQuery2 := ADOQuery1,控件的指定(转换),数据并未复制,还是的数据。 精细复制,要修改“字段名”一致,才能复制。
lyhoo163 2018-02-12
  • 打赏
  • 举报
回复
如果全部数据复制,且表结构一致。 一、用SQL直接复制

insert into table2 select * from table1 where ... 
二、全部复制

adoquery1.Recordset:=adoquery1.Recordset;
三、克隆

adoquery1.Recordset:=adoquery1.Recordset.clone(Tlocktype); 
or:
ADODataSet2.Clone(ADODataSet1) 
四、Assign

ADOQuery2.Assign(ADOQuery1) 
五、精细复制

begin
  with ADOQueryA.DataSource.DataSet do
  begin
    First;
    while Not Eof do Delete;
  end;
  with ADOQueryB.DataSource.DataSet do
  begin
    First;
    while Not Eof do
    begin
      ADOQueryA.DataSource.DataSet.FieldByName('AAA'):=FieldByName('AAA');
      ADOQueryA.DataSource.DataSet.FieldByName('BBB'):=FieldByName('BBB');
      ADOQueryA.DataSource.DataSet.FieldByName('CCC'):=FieldByName('CCC');
      ......     
      Next; 
    end;
  end;
end;
lyhoo163 2018-02-10
  • 打赏
  • 举报
回复
BDE模式,有个TBatchMove控制,复制数据的功能。ADO找一下,第三方控件?
DelphixpeFan 2018-02-09
  • 打赏
  • 举报
回复
关注一下,我现在基本上在后台数据库不能连接的时候,在前台更新数据都是用这个方法,只是用了线程,省得程序卡死在那不亲民,做好更新标识,也就是初次运行更新耗时些,后面更新都是增量更新,时间都不长;看看有没有更好的方法.....
lyhoo163 2018-01-29
  • 打赏
  • 举报
回复
工整的做法,运程表外循环,本地表内循环,如果无ID插入,有就更新。此法规范,但耗时。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧