有2个数据库,db1和db2,现在想把db1的table1的一些数据批量插入到db2的table1中。
先用一个qry1,连接到db1,把数据select 出来。
然后在用一个连接到db2的qry2,通过qry1->clone(qry1),来把数据导入到qry2中,现在有个问题,怎么把数据插入db2的table1中呢?

解决方案 »

  1.   

    在clone前把qry2连接到db2的table1, select一个空的数据集出来再post
    不知道可以不,没试过
      

  2.   

    1.可以用循环,这个不说了
    2.'insert into A select * from B in '+QuoteStr(B表的数据文件路径),此方法使用与access,如果是sql server等,需要视具体情况而定
      

  3.   

    只用一个qry连接到db2数据库,确保db2数据库的table1里面的字段和db1数据库table1里面的字段类型相同、长度一致。  ADOQuery2.Close;
      ADOQuery2.SQL.Text:='insert into text2.dbo.a(xm,mc) select xm,mc from test.dbo.a';
      ADOQuery2.ExecSQL;以上代码是将test数据库里面的a表中的字段xm,mc添加到数据库text2数据库的表a的字段xm,mc中。
      

  4.   


    也许
    with qry1 do
      First;
      repeat
        qry2.InsertRecord([f1,f2,f3...,fn]);{你必须自己确保操作的合法性}
      until Eof
    end;如果嫌这麻烦,我想,你就需要:
    a. 首先确保要操作的两个表的结构相同;
    b. 从#1表中检出制定的记录ds1,从#2表中选出所有记录ds2,然后将ds1中的记录并入ds2中;
    c. 可能需要判定游标是否支持以上操作,就算支持还需要修正ds2中的记录计数,等等。
    d. 更新也许会成功。相对来说,我觉得还是第一种方法比较好,后者除非能带来明显或巨大的性能提升,且你能保证安全,也不失为一种好方法。
    速度快点,Crash多点,更新频点,让客户v1,v2,v3的挤荷包,也许也不错呀。
      

  5.   

    坏了,把Next给掉了
    with qry1 do 
      First; 
      repeat 
        qry2.InsertRecord([f1,f2,f3...,fn]);{你必须自己确保操作的合法性} 
        Next;
      until Eof 
    end; 
      

  6.   

    function tmain_f.qry2(sql:string;typ:char):boolean;
    begin
      db.qry2.close;
      db.qry2.SQL.text:=sql;
      try
        if typ='o' then db.qry2.open;
        if typ='e' then db.qry2.execsql;
        result:=true;
      except
        messagebox(0,'连接超时!','失败',MB_ICONWARNING+MB_TASKMODAL+MB_OK);
        result:=false;
      end;
    end;function tmain_f.qry1(sql:string;typ:char):boolean;
    begin
      db.qry1.close;
      db.qry1.SQL.text:=sql;
      try
        if typ='o' then db.qry1.open;
        if typ='e' then db.qry1.execsql;
        result:=true;
      except
        messagebox(0,'连接超时!','失败',MB_ICONWARNING+MB_TASKMODAL+MB_OK);
        result:=false;
      end;
    end;function tconn_f.synchronous_db(sql:string;table1:string):boolean;
    var
    i:integer;
    begin
      if main_f.sql_qry1(sql,'o') then
      begin
        main_f.sql_qry2(sql,'o');
        //delete record
        while not db.qry2.Eof do
          if db.qry1.Locate(db.qry2.Fields[0].FieldName,db.qry2.Fields[0].AsString,[])=false then db.qry2.Delete else db.qry2.next;
        //update record
        while not db.qry1.Eof do
        begin
          if db.qry2.Locate(db.qry1.Fields[0].FieldName,db.qry1.Fields[0].AsString,[])=false then
          begin
            db.qry2.Insert;
            for I := 0 to db.qry1.FieldCount - 1 do
              db.qry2.Fields[i]:=db.qry1.Fields[i];
          end
          else
          begin
            db.qry2.UpdateRecord;
            for I := 0 to db.qry1.FieldCount - 1 do
            db.qry2.Fields[i]:=db.qry1.Fields[i];
          end;
        end;
        result:=true;
      end
      else result:=false;
    end;