碰到个非常棘手的问题,请高手们帮忙!有数据库A、数据库B,各有数据表test,字段名、类型、长度完全一样。
要求把数据库A的test里的数据通过XML文件的方式导入数据库B的test表里,
要考虑主键重复问题。
即:通过SQL语句把符合条件的A.test里的数据写入XML文件,然后通过读取XML文件
的内容把数据导入B.test。哪位高手给点源代码呀。先谢谢了!
可以发到我的信箱里:[email protected]

解决方案 »

  1.   

    懒人,不自己写,还要别人送你源代码?
    我正在写一个EJB专门是干这个的。不过既然你是搞delphi的,给你你也不懂。
      

  2.   

    给点建议也行呀比如说不用XML,用其他技术实现也行呀
      

  3.   

    什么意思TBatchMove能实现啊
    Delphi有详细的例子
      

  4.   

    可能是我说的不够具体吧,我现在要做的是异地的俩个数据库的操作,如果通过远程连接的方式,安全性方面有问题,老板不让用这种方式。
    然后我们用XML文件做载体的方式,传输的时候做压缩、加密,这样安全性相对比较可靠了,但是我们现在用的方法都要另外生成影射文件,很烦琐。
    所以我想delphi可不可以直接对xml操作来实现和数据库的交互呢?
      

  5.   

    没空给你写代码DELPHI中可以用ClientDataSet进行数据库表和XML之间的来回转换,自己去看DEMO
      

  6.   

    TBatchMove,看demo。用XML干嘛?这么麻烦。
      

  7.   

    用ClientDataSet
    操作XML可以用XMLDocument
    可以考虑三层结构,中间传送的是XML。
    SOAP也是如此
      

  8.   

    to shagan(上海外地人) 
    可以给点代码吗?
      

  9.   

    天哪!难道不会直接用SQL SERVER转啊!中间非得用个什么XML!脱裤子放屁啊!
      

  10.   

    hehe^^ 你都一个猩猩了,还要代码呀 Delphi操作XML文件你可以用MSXML3.0以上的版本进行处理操作xml文件也很简单写的时候可以用memo1.lines.add('<no1>'+Node+'</no1>);
    ......这种笨方法读的时候unit Linkup;interfaceuses
      SysUtils, Windows, Messages, Classes, Graphics, Controls,
      Forms, Dialogs, OleServer, MSXML2_TLB, Variants;type
      TLinkupXML = class (TComponent)
      private
        FXMLDoc: TDOMDocument30;
        function Orientation(var aNodeList: IXMLDOMNodeList): Boolean;
      public
        constructor Create(AOwner:TComponent);override;
        destructor Destroy; override;
        function Get_Value(aNodeIndex: Integer): string;
        function Get_Name(aNodeIndex: Integer): string;
        function NodeCount: Integer;
        function isLinkupXML: Boolean;
        procedure OpenXMLFile(aXMLFileName: String);
      end;
      procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [TLinkupXML]);
    end;{
    ********************************** TLinkupXML **********************************
    }constructor TLinkupXML.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FXMLDoc := TDOMDocument30.Create(nil);
    end;destructor TLinkupXML.Destroy;
    begin
      inherited Destroy;
      FXMLDoc.Free;
    end;function TLinkupXML.Get_Name(aNodeIndex: Integer): string;
    var
      vNodeList: IXMLDOMNodeList;
    begin
      try
        if Orientation(vNodeList) then
        begin
          if aNodeIndex >= vNodeList.length then
            aNodeIndex := vNodeList.length - 1;
          if aNodeIndex < 0 then
            aNodeIndex := 0;
          Result := vNodeList.item[aNodeIndex].nodeName;  //返回Node名称
        end
        else  //不是linkupXML返回空
          Result := '';
      except
        Result := '';
      end;
    end;function TLinkupXML.Get_Value(aNodeIndex: Integer): string;
    var
      vNodeList: IXMLDOMNodeList;
    begin
      try
        if Orientation(vNodeList) then
        begin
          if aNodeIndex >= vNodeList.length then
            aNodeIndex := vNodeList.length - 1;
          if aNodeIndex < 0 then
            aNodeIndex := 0;
          Result := vNodeList.item[aNodeIndex].text;  //返回Node内容
        end
        else  //不是linkupXML返回空
          Result := '';
      except
        Result := '';
      end;
    end;function TLinkupXML.isLinkupXML: Boolean;
    var
      vNodeList: IXMLDOMNodeList;
    begin
      try
        if Orientation(vNodeList) then
          Result := True
        else
          Result := False;
      except
        Result := False;
      end;
    end;function TLinkupXML.NodeCount: Integer;
    var
      vNodeList: IXMLDOMNodeList;
    begin
      try
        if Orientation(vNodeList) then
          Result := vNodeList.length
        else
          Result := -1;
      except
        Result := -1;
      end;
    end;procedure TLinkupXML.OpenXMLFile(aXMLFileName: String);
    begin
      FXMLDoc.DefaultInterface.async := False;
      FXMLDoc.DefaultInterface.load(aXMLFileName);
    end;function TLinkupXML.Orientation(var aNodeList: IXMLDOMNodeList): Boolean;
    begin
      try
        //aNodeList := FXMLDoc.DefaultInterface.selectNodes('linkup');
        aNodeList := FXMLDoc.DefaultInterface.selectNodes('GFLOWASSISTANTINTERFACE');
        aNodeList := aNodeList.item[0].childNodes;
        if aNodeList.length > 0 then
        begin
          Result := True
        end
        else
          Result := False;
      except
        Result := False;
      end;
    end;
    end.你自己看看吧鄙视你一下先!---------
    春困秋乏夏打盹,睡不醒的冬三月 ^^!
      

  11.   

    TNND我决定分都给下一个来者
      

  12.   

    不是吧,我纯粹是来学习的,我不懂XML
      

  13.   

    下面是读XML文件的方法,你可以试一下,XML的结构跟tree差不多,研究一下没什么复杂的uses xmldoc,xmlintf;procedure TForm1.Button1Click(Sender: TObject);
    var  xml:txmldocument;
      root,node1:ixmlnode;
      tabname,fname:string;
    begin
        xml:=TXMLDocument.Create(application);
        xml.XML.LoadFromFile(opendialog1.FileName);
        xml.Active:=true;
        root:= xml.DocumentElement.ChildNodes.First;
        root:= root.ChildNodes.FindNode('Table1');
        tabname:= root.Attributes['Tablename'];
        node1:= root.ChildNodes.FindNode('Fields');
        fname:= node1.ChildNodes.FindNode('FieldName').Text;
        xml.Active:=false;
    end;
      

  14.   

    我用xml写了一个,用xml实现简单,所以建议用xml,不过原代码那就自己写吧,~_~
      

  15.   

    这么多人写代码?最简单的还是用CDS:放三个控件:ADODataSet(Select A.test 中的数据), DataSetProvider, ClientDataSet
    然后把ADODS和CDS都Open一下。
    然后调用CDS的SaveToFile,批定文件名和格式(dfXML),即可将数据表生成一个XML文件到另一边后也是放一个CDS,然后用LoadFromFile即可导入,然后自己想办法吧CDS里的数据导到B.test里吧(最简单的办法是用循环了)
      

  16.   

    楼上的单个表是没问题的,实际使用一个xml文件我一般都有多个表
      

  17.   

    to qdwind(风中浪子)
    你说的方法,我在应用程序里实现了,没有问题,但是如果写ActiveX的话,就出问题
    帮我看一下下面这个帖子吧
    http://expert.csdn.net/Expert/topic/2474/2474643.xml?temp=.3731195
    先谢了!
      

  18.   

    to Raptor(猛禽)
    "放三个控件:ADODataSet(Select A.test 中的数据), DataSetProvider, ClientDataSet
    然后把ADODS和CDS都Open一下。
    然后调用CDS的SaveToFile,批定文件名和格式(dfXML),即可将数据表生成一个XML文件"DataSetProvider干什么用呢?我没用过ClientDataSet,能说详细些吗?
      

  19.   

    DataSetProvider是用MIDAS做三层时用的控件,这里只是用它来把数据从DataSet里导到ClientDataSet里
    这里的用法很简单:
    把DataSetProvider的DataSet属性设置为ADODataSet即可,然后把ClientDataSet的ProviderName属性设置为DataSetProvider即可,只要写三行代码:
    ADODataSet.Open;
    ClientDataSet.Open; // 甚至上一句也可以不要,CDS会自动操作
    ClientDataSet.SaveToFile( 'filename.xml', dfXML );
    即可将ADODataSet中的内容保存为filename.xml