我想实现本地的两台机器的两个数据库之间导数据表。如数据库A->数据库B,前提是A和B的数据库类型可能不同,也可能相同,但B的数据库始终是SQL 2000。A的数据库可能是orcal、sql、sybase中的一种,并且我准备导的两个表的结构的字段也不同。请问用什么方法实现好。我不用第三方工具,因为我想在程序中实现,将来要实现自动定期导库,听说有BatchMove方法和DTS方法。但我都不是很熟悉。请高手在方向上指点一二。非常感谢。

解决方案 »

  1.   

    建立数据传输服务DTS包;
    然后写作业调用该数据包就可以实现定时、定期导入数据
      

  2.   

    非常感谢以上两位的热心回复。
    to CEdward:
        我正是要自己写程序,只是不知道用什么方法好。希望在方向上指点一二。
    to 47522341:
       dts,是个很好的建议。不过我没有用过,也是近期查资料说有这个方法,不过好象都是工具,好象没有这方面的应用代码。能否写些代码。
      

  3.   

    自己写是最好的方法最简单最笨的办法就是
    1、一个ADOConnection连上A
    2、一个ADOConnection连上B
    3、然后象正常的数据库操作一样添加了,只是要批量而已,或者最苯的办法
       for I:=1 to A.表.RecordCount do
       begin
         B.表.Append;
         B.表.FieldByName('字段一').AsString:=A.表.FieldByName('字段一').AsString
         ......
         B.表.Post;
       end;
    当然要有很多判断,因为你的数据字段类型不一致,这个时候要考虑字符转数字的空值类型DTS也行,估计操作起来很恐怖,写这个DTS包很恐怖,因为你的A和B的数据库都不同,如果A也是SQL那么DTS是最好的选择BatchMove办法不可行,原因还是数据库和库结构都不同。
      

  4.   

    首先感谢大家的回复,没有让帖子沉下去。to Hank(星星农场):
      我之前就考虑过你的第一个方法,自己也认为这是一个没有办法时的办法,“简单很笨”,呵呵,不过方法简单也不是不行,最担心的是它的批量导数据的速度,和程序在多种异构数据库之间的可移植性。   我最近还是在查有关DTS的方法。不过目前只能实现ACCESS->ACCESS,目前正在改,如果可能实现access->sql的话,估计其他的问题就不大了。就很有可能实现sql->sql,orcal->sql....,只要改变连接引擎,我想如果实现了速度上应该比那个“简单的方法”快,移植性上也要好吧。在修改中。期待其他人的更好的建议和方法。
      

  5.   

    如下要领:
    1、采用D2007
    2、采用DBExpress方式
    3、编写数据管道程序,代码形如:
    var
      I: integer;
    begin
      ibqSelectA.Open;  I := 1;
      ibqSelectA.First;
      while not ibqSelectA.EOF do begin
        ibqInsertB.ParamByName('REC_KEY').AsInteger :=
          ibqSelectA.FieldByName('REC_KEY').AsInteger;    ibqInsertB.ParamByName('FIELD_1').AsString  :=
          ibqSelectA.FieldByName('FIELD_1').AsString;
        ibqInsertB.ParamByName('FIELD_2').AsString  :=
          ibqSelectA.FieldByName('FIELD_2').AsString;
        ibqInsertB.ParamByName('FIELD_3').AsString  :=
          ibqSelectA.FieldByName('FIELD_3').AsString;
        ibqInsertB.ParamByName('FIELD_4').AsString  :=
          ibqSelectA.FieldByName('FIELD_4').AsString;
        ibqInsertB.ParamByName('FIELD_5').AsString  :=
          ibqSelectA.FieldByName('FIELD_5').AsString;
        ibqInsertB.ParamByName('FIELD_6').AsString  :=
          ibqSelectA.FieldByName('FIELD_6').AsString;
        ibqInsertB.ExecSQL;
        Inc(I);
        if i mod 100 = 0 then begin
          IBTransaction1.CommitRetaining;
        end;
        ibqSelectA.Next;
      end;
      IBTransaction1.CommitRetaining;
    end;
      

  6.   

    因为采用DBX,所以必须保证是比较新出的Delphi。我推荐最好是D2007