while not adoquery1.Eof do
  begin
    adoquery2.Close;
    adoquery2.sql.clear;
    adoquery2.sql.add('update table1 set id='+adoquery1.fieldbyname('id').asstring+'');
    adoquery2.sql.add('where 地址 like ''%'+adoquery1.Fieldbyname('address').asstring+'%''');
    adoquery2.ExecSQL;
    adoquery1.Next;
  end;
上面语句原来adoquery1连sql server2000,adoquery2连dbf数据库
后来我把dbf的数据先导进sql server2000,再运行以上语句,结果比原来还慢很多。
请问各位高手这是什么原因?有什么解决方法?

解决方案 »

  1.   

    加条语句
    if not adoquery2.Prepared  then adoquery2.Prepared:=true;
      

  2.   

    如果数据量大的话,你一条一条的进行当然慢了,其实我看楼主的代码不用逐条进行的,
    adoquery2.sql.add('update table1 set id='+adoquery1.fieldbyname('id').asstring+'');
        adoquery2.sql.add('where 地址 like ''%'+adoquery1.Fieldbyname('address').asstring+'%''');
        adoquery2.ExecSQL;
    直接这样就OK了
      

  3.   

    如果放在一个数据库里可以直接用一条sql更新。
      

  4.   

    用参数
    adoquery2.sql.clear;
        adoquery2.sql.add('update table1 set id=:id')
    ADOQuery2.Parameters.ParamByName('id').Value:=adoquery1.fieldbyname('id').asstring;
      

  5.   

    不用SQL语句会好些吧,
    首先ADOQUERY2设置成缓存更新,
    再查出ADOQUERY1的结果集,然后再查出ADOQUERY2的结果集,然后循环
    while not adoquery1.Eof do
    begin
    if adoquery2.locate('地址',adoquery1.fieldbyname('address').asstring,
           [非精确匹配的OPTION])then 
      adoquery2.fieldbyname('id').asstring=adoquery1.fieldbyname('id').asstring;adoquery1.Next;
    end;
    adoquery2.upplyupdate;
      

  6.   

    先写进缓存,最后才全部更新,这个方法的确会快很多。但是,楼上的方法只可以更新一条与adoquery1.fieldbyname('address').asstring匹配的记录,而我是想把所有匹配的记录都更新,请问该如何修改?
      

  7.   

    忽略了,那看看这样行不行:
    var str1,str2:string;
    while not adoquery1.Eof do
    begin
      str1:=adoquery1.fieldbyname('address').asstring;
      adoquery2.first;
      while not adoquery2.eof do
      begin  
        str2:=adoquery2.fieldsbyname('地址').asstring;
        if pos(str1,str2)>0 then       
          adoquery2.fieldbyname('id').asstring=adoquery1.fieldbyname('id').asstring;
        adoquery2.next;
      end;
      adoquery1.Next;
    end;
    adoquery2.upplyupdate;
    实现是没问题,就是速度不知道会怎样,不管怎么说肯定会比写SQL语句快。
      

  8.   

    楼上的方法肯定不楼主的快。。
    而且要快很多。。
    因为每次开关数据连接都需要花时间的
    不过服务器不是本机的话就要快些。。
    如果实在不行的话就把query1,query2分成两个进程这样绝对快,不过要复杂些
      

  9.   

    楼上的楼上的方法我已经试过了,速度还是不理想。
    当adoquery1和adoquery2在不同的数据库时,运行的时间是7分钟,
    但同在sql server2000时就要40多分钟,两个的区别太大了,所以感觉不能接受,请原谅。请问还有没有其他的方法啊?
    楼上说分两个进程,请问如何实现?
      

  10.   

    --/* dBase IV文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase IV;DATABASE=C:\' --c:\是目录
    ,'select * from [客户资料4.dbf]') --客户资料4.dbf是文件名
    --*/--/* dBase III文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;DATABASE=C:\'
    ,'select * from [客户资料3.dbf]')
    --*/--/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录
    'select * from [aa.DBF]') --aa.dbf是文件名
    =============================================已foxpro为例:
    update openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录
    'select * from [aa.DBF]')
    set id=b.id from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录
    'select * from [aa.DBF]') a, orders b 
    where a.addr=b.addr
      

  11.   

    40分钟太长,肯定不行,不知道楼主的表里有多少数据。
    这样。写一个存储过程吧,(table1为query1对应的表,tabe2 为query2对应的表)
    DECLARE cursor_ cursor for select id,address from table1
    declare @id nvarchar(10),@address nvarchar(10)
    open cursor_
    fetch next from cursor_ into @id,@address
    while @@fetch_status=0 
    begin  
      update table2 set id=@id where address like '%'+@address+'%'
      fetch next from cursor_ into @id,@address
    end  
    close cursor_
    deallocate cursor_
    游标的速度不怎么样,但我想肯定会比原来两中方法好的多,试试。
    如果再不行我也没办法了,呵呵!
      

  12.   

    table1有3万条记录,我测试时table2的记录是2800条,运行起来要40多分钟(分开不同的数据库只是用了7分钟就运行完,不知为何会这样?)。存储过程我都试过了,运行时间都是差不多,可能是因为用到游标吧。
    我以后真正运行时table2最少都有10万条记录,有时甚至有100万条。table1的记录以后都会增加,到时可能会有10万条左右。
    救命啊,请各位大哥帮帮小弟呀!
      

  13.   

    同意 hongama(delphi级民工) 、 RobinHZ(熊掌)
       可以直接用一条sql更新。
      

  14.   

    楼上的方法我已经试过,但符合like条件的记录有多条,用一条语句完成不了