各位大侠:
       我想把XML文件导入到数据库(SQL或ACCESS)中,请问该如何做?给我个思路,谢谢大家!在线等.

解决方案 »

  1.   

    ClientDataSet有一个LoadFromFile功能,能够从XML文件中加载数据,而后装入SQL中即可。
      

  2.   

    呵呵,就象一般文件导入不行吗?Stream
      

  3.   

    use XMLDoc, XMLIntf;
    var XDoc:TXMLDocument;RootNode,NodeF,NodeC:IXMLNode;pb:TProgressBar;
    begin
      XDoc:=TXMLDocument.Create(Application);
      XDoc.LoadFromFile(Edit2.Text);
      XDoc.Active:=True;
      RootNode:=XDoc.DocumentElement;
      NodeF:=RootNode.ChildNodes.First;
      Get_Data('SELECT TOP 1 * FROM '+ComboBox1.Text);
      pb:=TProgressBar.Create(Self);
      pb.Parent:=GroupBox1;
      pb.Align:=alBottom;
      pb.Max:=RootNode.ChildNodes.Count;
      while NodeF<>nil do begin
        DM.Qry.Append;
        NodeC:=NodeF.ChildNodes.First;
        for i:=0 to DM.Qry.Fields.Count-1 do begin
          DM.Qry.Fields[i].AsString:=NodeC.Text;
          NodeC:=NodeC.NextSibling;
        end;
        DM.Qry.Post;
        pb.Position:=pb.Position+1;
        NodeF:=NodeF.NextSibling;
      end;
      FreeAndNil(pb);
      my_msg(m_success,'导入数据成功,记录数:'+IntToStr(RootNode.ChildNodes.Count));
      FreeAndNil(XDoc);
    end;呵呵,以前写的,希望有所帮助
      

  4.   

    procedure TFGJ.bsSkinSpeedButton3Click(Sender: TObject);
    var tmpquery2:tadoquery;
        tmpfile:string;
        tmptable:tadotable;
    begin
      if application.MessageBox('导入答案将会清空以前的考生答案,确定是否继续?','提醒',MB_OKCANCEL or MB_ICONWARNING)=mrok then  begin
        IF BSopen.Execute then
       try
        try
        begin
          tmpfile:=bsopen.FileName;
          tmptable:=tadotable.Create(self);
          tmpquery2:=tadoquery.Create (self);
          tmpquery2.Connection :=dm.connect ;
          tmptable.Connection :=dm.connect ;
          tmptable.TableName:='exam_answer';      with tmpquery2 do
          begin
            close;
            sql.Clear;
            sql.Add('delete * from exam_answer');
            execsql;
          end;
          tmptable.LoadFromFile(tmpfile);      tmptable.First;     while not tmptable.Eof do
         begin
          with tmpquery2 do
          begin
            close;
            sql.Clear;
            sql.Add('insert into exam_answer(kh,xm,sj_id,sjts,tk_id,stbh,tx,daa,dab,dac,dad,dae,daf,tkda,df) values(:kh,:xm,:sj_id,:sjts,:tk_id,:stbh,:tx,:daa,:dab,:dac,:dad,:dae,:daf,:tkda,:df)');
            parameters.ParamByName('kh').Value :=tmptable.fieldbyname('kh').AsString;
            parameters.ParamByName('xm').Value :=tmptable.fieldbyname('xm').AsString;
            parameters.ParamByName('sj_id').Value :=tmptable.fieldbyname('sj_id').AsString;
            parameters.ParamByName('tx').Value :=tmptable.fieldbyname('tx').AsString;
            parameters.ParamByName('sjts').Value :=tmptable.fieldbyname('sjts').AsString;
            parameters.ParamByName('tk_id').Value :=tmptable.fieldbyname('tk_id').AsString;
            parameters.ParamByName('stbh').Value :=tmptable.fieldbyname('stbh').AsString;
            parameters.ParamByName('daa').Value :=tmptable.fieldbyname('daa').AsBoolean;
            parameters.ParamByName('dab').Value :=tmptable.fieldbyname('dab').asboolean;
            parameters.ParamByName('dac').Value :=tmptable.fieldbyname('dac').AsBoolean ;
            parameters.ParamByName('dad').Value :=tmptable.fieldbyname('dad').AsBoolean ;
            parameters.ParamByName('dae').Value :=tmptable.fieldbyname('dae').AsBoolean ;
            parameters.ParamByName('daf').Value :=tmptable.fieldbyname('daf').AsBoolean ;
            parameters.ParamByName('tkda').Value :=tmptable.fieldbyname('tkda').AsString;
            parameters.ParamByName('df').Value :=tmptable.fieldbyname('df').AsString;
            execsql;
          end;
          tmptable.next;
         end;
         showmessage('导入完成,累死了...')
        end;
        finally
          tmptable.Free;
          tmpquery2.Free;
        end;
      except
        showmessage('导入未完成。:(')
      end;
    end;
    end;如果单纯的LOAD出来,它是不直接写到后台数据表的。分析下源码就知道它LOAD之前先CLOSE了数据表。只有一条一条增加到后台数据表了。