请问在delphi中如何操作dbf数据表,尤其是带有索引的dbf文件,我用query,table操作都提示“could not find language driver”,换成没有索引的dbf 文件一切正常,请问如何解决呀,有没有这方面的书籍,多谢!

解决方案 »

  1.   

    用ODBC来访问就可以了,做好了ODBC后,在ADOconnection中选择你那个驱动,然后就可能在Query中写SQL了,
      

  2.   

    楼上的讲得到,建立ODBC,要注意SQL的使用
      

  3.   

    你要建立相应的odbc连接,并选择正确的驱动。
      

  4.   

    --/* dBase IV文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]')
    --*/--/* dBase III文件
    select * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]')
    --*/--/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
    'select * from [aa.DBF]')
    --*//**************导入DBF文件****************/
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;
    SourceDB=e:\VFP98\data;
    SourceType=DBF',
    'select * from customer where country != "USA" order by country')
    go
    /***************** 导出到DBF ***************/
    如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句insert into openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
    'select * from [aa.DBF]')
    select * from 表说明:
    SourceDB=c:\  指定foxpro表所在的文件夹
    aa.DBF        指定foxpro表的文件名.
      

  5.   

    //**************************************************************
    //功能: 将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;
      

  6.   

    //*******************************************************
    //创建一个ODBC系统数据源(DSN),
    //数据源名称:MyDbf
    //数据库驱动文件:System32/vfpodbc.dll
    //数据库类型: DBF
    //数据存放目录:DbfFilePath
    //*******************************************************}
    procedure TDbfDTS.CreateDbfOdbc(DbfFilePath:String);
    var
      registerTemp : TRegistry;
      Sysdir : array[0..256] of char ;
      SystemName,DriverFileName : String;
    begin
      //获得系统目录;驱动文件;
      GetSystemDirectory(SysDir,256);
      SystemName := SysDir ;
      DriverFileName := SystemName + '/' + 'vfpodbc.dll';  registerTemp := TRegistry.Create; //建立一个Registry实例
      try
        with registerTemp do
        begin
          RootKey:=HKEY_LOCAL_MACHINE;//设置根键值为HKEY_LOCAL_MACHINE      //找到Software\ODBC\ODBC.INI\ODBC Data Sources
          if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
          begin //注册一个DSN名称
            WriteString( 'MyDbf', 'Microsoft Visual FoxPro Driver' );
          end
          else
          begin//创建键值失败
            MessageBox(0,'增加ODBC数据源失败','错误',MB_OK+MB_ICONERROR);
            exit;
          end;
          CloseKey;      //找到或创建Software\ODBC\ODBC.INI\MyAccess,写入DSN配置信息
          if OpenKey('Software\ODBC\ODBC.INI\MyDbf',True) then
          begin
            WriteString( 'SourceDB', DbfFilePath );//DBF目录
            WriteString( 'SourceType', 'DBF' );//数据类型
            WriteString( 'Driver', DriverFileName );//驱动程序DLL文件
          end
          else//创建键值失败
          begin
            MessageBox(0,'增加ODBC数据源失败','错误',MB_OK+MB_ICONERROR);
            exit;
          end;
          CloseKey;
        end;
      finally
        registerTemp.Free;
      end;
    end;