问题描述:1. 用ADODataSet1.SaveToFile('..\DownDataxml\SQ_JT_JiBen.xml', pfXML)将表的记录导出到XML文件,
2. 用最简洁的方式(代码)再把这些XML数据导入(保存)到其他结构完全相同的SQL数据表中。问题:
   上面第1步,很容易实现。而第2步实现实在很难。
   在C#中,这是很容易的事情。在delphi6有没有快捷简洁的办法?   谢谢!

解决方案 »

  1.   

    把整个xml文件作为一个大字符串,保存到一个varchar(max)字段
      

  2.   

    将xml读到数据集,然后逐条写到数据库
      

  3.   

    楼上,我也是这么想的!但是在定义插入功能(函数)时,对于各字段的值,有点问题不知道怎么处理:function Insert(ADOConn:TADOConnection;ADOQry:TADOQuery;TabName:string):string;
    var ADOCommand1: TADOCommand;
        MySqlStr:string;
        MySqlValue:string;
        i:integer;
    begin
      ADOCommand1 := TADOCommand.Create(Application);
      ADOCommand1.Connection:=ADOConn;  //字段列表
      MySqlStr:='insert ' + TabName + '(';
      for i:=0 to ADOQry.FieldCount-1 do
      begin
        MySqlStr:=MySqlStr+ADOQry.FieldDefList[i].Name;
        if i<ADOQry.FieldCount-1 then MySqlStr:=MySqlStr + ',' else MySqlStr:=MySqlStr + ')';
      end;  ADOQry.First;
      while not ADOQry.Eof do
      begin    //值列表
        MySqlValue:=' values(';
        for i:=0 to ADOQry.FieldCount-1 do
        begin
          if ADOQry.FieldList[i].DataType=ftString then
          begin
              MySqlValue:=MySqlValue+ '''' + ADOQry.FieldList[i].AsString + '''';
          end
          else
          begin
            if ADOQry.FieldList[i].AsString='' then
            begin
              case ADOQry.FieldList[i].DataType of
                ftCurrency: MySqlValue:=MySqlValue+  '0';
                ftInteger: MySqlValue:=MySqlValue+   '0';
                ftTimeStamp: MySqlValue:=MySqlValue+ 'null';
              else
                MySqlValue:=MySqlValue + 'null';
              end;
            end
            else
            begin
               MySqlValue:=MySqlValue+ ADOQry.FieldList[i].AsString;
            end;
          end;
          if i<ADOQry.FieldCount-1 then MySqlValue:=MySqlValue + ',' else MySqlValue:=MySqlValue + ')';
        end;    //执行插入
        ADOCommand1.CommandText:=MySqlStr+MySqlValue;
        ADOCommand1.Execute;    ADOQry.Next;
      end;  ADOCommand1.Free;
    end;
      

  4.   

    如果数据库是mssql,则可以:
    insert tbname (field1name,field2name,...,fieldNname)
    select 'f1-1','f1-2',...,'f1-N'
    union all select 'f2-1','f2-2',...,'f2-N'
    ...
    union all select 'fm-1','fm-2',...,'fm-N'
    1、运行效率高
    2、sql语句短
    3、不管类型,都加引号是不会错的(不用判断null字段)(但是,datetime类型字段的毫秒信息会丢失)
      

  5.   

    谢谢楼上'f1-1','f1-2',...,'f1-N' 是什么? 来自XML文件?
      

  6.   

    大家帮助完善下面这个函数吧:function Insert(ADOConn:TADOConnection;ADOQry:TADOQuery;TabName:string):string;
    var ADOCommand1: TADOCommand;
        MySqlStr:string;
        MySqlValue:string;
        i:integer;
    begin try  ADOCommand1 := TADOCommand.Create(Application);
      ADOCommand1.Connection:=ADOConn;  ADOCommand1.CommandText:='begin tran';  //开始1个事务
      ADOCommand1.Execute;  //字段列表 开始
      MySqlStr:='insert ' + TabName + '(';
      for i:=0 to ADOQry.FieldCount-1 do
      begin
          if ADOQry.FieldList[i].DataType <> ftBytes then  //放弃ftTimeStamp类字段
          begin
             MySqlStr:=MySqlStr+ADOQry.FieldDefList[i].Name;
             if i<ADOQry.FieldCount-1 then MySqlStr:=MySqlStr + ',' else MySqlStr:=MySqlStr + ')';
          end;
      end;
      //字段列表 结束  ADOQry.First;
      while not ADOQry.Eof do
      begin    //值列表  开始
        MySqlValue:=' values(';
        for i:=0 to ADOQry.FieldCount-1 do
        begin
          if ADOQry.FieldList[i].DataType <> ftBytes then  //放弃ftTimeStamp类字段
          begin
              if ADOQry.FieldList[i].DataType = ftString then
              begin
                  MySqlValue:=MySqlValue+ '''' + ADOQry.FieldList[i].AsString + '''';
              end
              else
              begin
                if ADOQry.FieldList[i].AsString='' then
                begin
                  case ADOQry.FieldList[i].DataType of
                     ftBCD: MySqlValue:=MySqlValue + '0';        //money
                     ftInteger: MySqlValue:=MySqlValue +  '0';   //int
                  else
                     MySqlValue:=MySqlValue + 'null';
                  end;
                end
                else
                begin
                   MySqlValue:=MySqlValue+ ADOQry.FieldList[i].AsString;
                end;
              end;
              if i<ADOQry.FieldCount-1 then MySqlValue:=MySqlValue + ',' else MySqlValue:=MySqlValue + ')';
          end;
        end;
        //值列表  结束
        //执行插入
        ADOCommand1.CommandText:=MySqlStr+MySqlValue;
        ADOCommand1.Execute;    ADOQry.Next;
      end;  ADOCommand1.CommandText:='commit tran';     //提交1个事务
      ADOCommand1.Execute;
      Result := '0';       //返回值(成功)
      ADOCommand1.Free; except
       ADOCommand1.CommandText:='rollback tran';  //回滚1个事务
       ADOCommand1.Execute;
       Result := '1';      //返回值(失败)
       ADOCommand1.Free;
     end;end;
      

  7.   

    注意 ADOQry 中包含从XML文件中读入的全部数据