怎样用ADO把一个dbf文件里的内容导入到另一个dbf文件里?

解决方案 »

  1.   

    用ADOQuery1读一个DBF中的文件
    用别一个ADOQuery2存入另一个DBF文件中
      

  2.   

    直接读写DBF文件,这样最快//**************************************************************
    //功能: 将Dbf文件中的数据导入到SQL Server数据库中
    //說明:
    //输入:
    //输出: true 导出成功 false 导出失败
    //作者: 侯磊峰
    //日期: 2005-7-15
    //备注:
    //*******************************************************************
    function TDbfDTS.FileToDB1: Boolean;
    type
      //dbf文件头结构
      Tdbf_head = record
        Vers : char ; //版本标志
        yy,mm,dd :Byte;  // 最后更新年、月、日
        No_Recs : Longword ; // 文件包含的总记录数;
        Head_Len,Rec_Len : word;  //文件头长度,记录长度
        Reserved : array[0..19] of char ;
      end;
      //dbf字段描述结构
      Tdbf_field = record
        Field_Name : array[0..10] of char ;  //字段名称;
        Field_Type : char;                   //字段类型     
        Offset : longword;                   //偏移量
        Field_Length : byte;                 //字段长度
        Field_Decimal : byte ;               //浮点数整数部分长度
        Reserved1 : array[0..1] of char;     //保留
        Dbaseiv_id : char;                   //DBASE IV work area id
        Reserved2 : array[0..9] of char;     //
        Production_index : char ;            //
      end;
      //dbf字段值
      TDBFField = record
        Name : String[10];
        First : Integer;
        Len : Integer;
        FieldType : String[1];
        Value : String;
      end;
    var
      f : File;
      Dbf_head : Tdbf_head;
      Dbf_Field : Tdbf_field ;
      Rec_Count : Integer;
      Buf : pchar;
      i,j : Integer;
      DbfField : Array of TDbfField ;
      LenCount : Integer;
      RecordValue : String;  Ads : TADODataSet ;
      Field,SqlStr : String;  StepValue : Integer;
    begin
      Result := False ;  if not FileExists(ReadyDTS.FileName) then
      begin
        MessageBox(0,Pchar('文件'+ReadyDTS.FileName+'不存在!!'),'提示',MB_ICONINFORMATION+MB_OK);
        exit;
      end;  // 1 获得Field,执行ADS;
      Field := Trim(ReadyDTS.Field) ;
      if (Length(Field) = 0) or (Field = '*') then  //所有字段
        SqlStr := 'Select * From '+ReadyDTS.TableName+' Where 0=1'
      else
        SqlStr := 'Select '+Field+ ' From '+ReadyDTS.TableName+' Where 0=1' ;  // 2 创建Ads
      Ads := TADODataSet.Create(nil);
      Ads.Connection := ReadyDTS.ADOCon;
      //关闭数据感知空间,可加快速度;
      Ads.DisableControls  ;
      try
        ADS.Close;
        ADS.CommandText := SqlStr;
        ADS.Open;
      except
        on E:Exception do
        begin
          writeLog('TDbfDTS.FileToDB',E.Message);
          MessageBox(0,pchar('字段名'+Field+'有错!!'),'错误',MB_ICONERROR+MB_OK);
          Ads.Free;
          exit;
        end;
      end;  AssignFile(f,ReadyDTS.FileName);
      Reset(f,1);
      try
        BlockRead(f,Dbf_head,Sizeof(dbf_head));
        //记录总数
        //头文件长度;
        //记录长度;
        //计算字段总数;
        Rec_Count :=  (Dbf_Head.Head_Len -296) div 32 ;    SetLength(DBFField,Ads.Fields.Count);
        LenCount := 1;
        Seek(f,Sizeof(dbf_head));
        for i := 0 to Rec_Count-1 do
        begin
          BlockRead(f,Dbf_Field,sizeof(Dbf_Field));      Field := Dbf_Field.Field_Name ;
          for j:=0 to Ads.Fields.Count - 1 do
          begin
            if UpperCase(Field)=UpperCase(Ads.Fields[j].FieldName) then
            begin
              DBFField[j].First := LenCount ;
              DBFField[j].Name := Dbf_Field.field_name;
              DBFField[j].Len := Dbf_Field.field_length ;
              DBFField[j].FieldType := Dbf_Field.field_type ;
    //          DbfField[j].First := Dbf_Field.Offset ;
              Break;
            end;
          end;      Seek(f,(i+1)*Sizeof(Dbf_Field)+Sizeof(Dbf_head));
          LenCount := LenCount + Dbf_Field.field_length ;
        end;    ProgressBarShow('从Dbf转换数据至Sql Server,请稍候...');    ReadyDTS.ADOCon.BeginTrans;
        try
          Seek(f,Dbf_head.head_len);
          buf := AllocMem(DBF_Head.Rec_Len);
          for i:=0 to Dbf_Head.No_Recs - 1 do
          begin
            // 如CancelDTS为true 则中断数据转换;
            if CancelDTS = true then
            begin
              ReadyDTS.ADOCon.RollbackTrans;
              exit ;
            end;        BlockRead(f,Buf^,Dbf_Head.Rec_Len);
            RecordValue := Buf ;
            RecordValue := Trim(RecordValue);
            Ads.Append;
            for j:=0 to Ads.Fields.Count-1 do
            begin
              Dbffield[j].Value :=Copy(RecordValue,DBFField[j].First,DBFField[j].Len);
              Ads.FieldValues[DbfField[j].Name] := DbfField[j].Value;
            end;
            Ads.Post;
            Seek(f,(i+1)*Dbf_Head.Rec_Len+Dbf_Head.head_len);
            if i mod Con_RefreshRecord = 0 then
            begin
              StepValue := (i*100) div Dbf_Head.No_Recs ;
              ProgressBarStep( StepValue ,i);
              Application.ProcessMessages;
            end;
          end;
          ReadyDTS.ADOCon.CommitTrans;
          FreeMem(buf);
          Result := true ;
        except
          On e : Exception do
          begin
            ReadyDTS.ADOCon.RollbackTrans;
            WriteLog('TDbfDTS.FileToDB',E.Message);
            MessageBox(0,'读Dbf数据或存Sql Server数据库错误!!','错误',MB_ICONERROR+MB_OK);
          end;
        end;
      finally
        ProgressBarClose;
        CloseFile(f);
      end;
    end;
      

  3.   

    我的意思是读一个dbf文件追加到另一个dbf文件的记录里,用adoquery.append好慢,
    用sql语句老报语法错