1. 程式人生 > >Delphi重建與刪除Foxpro(DBF)資料庫索引檔案CDX

Delphi重建與刪除Foxpro(DBF)資料庫索引檔案CDX

我發現DBF檔案資料的一個大祕密,因為要用到TBatchMove操作DBF檔案,需要使用索引,如果這個DBF檔案沒有包含索引,可以使用下面的

SQL建立索引:

create index 索引名 on "表名.dbf"(欄位名);

但是如果這個DBF檔案已經包含索引,可是這個CDX索引檔案壞了或是丟失了,用上面的SQL會提示'Index does not exist.File or

directory does not exist.這時候重新建立索引就失敗,但是我們可以把這個DBF檔案修改為不包含索引檔案的型別:修改這個檔案的第28個

位元組為0就可以了,

procedure TForm1.Button7Click(Sender: TObject);
const
  NoIndex:Byte=0;
var
  fByte:file of byte;
begin
  AssignFile(fByte,'csfzk.dbf');
  FileMode:=2;
  Reset(fByte);
  Seek(fByte,28);
  Write(fByte,NoIndex);
  CloseFile(fByte);

end;

這樣,先把索引檔案標識刪除了,並把索引檔案CDX刪除了,再用上面的SQL建立這個CDX檔案就好了,不然會提示:'Index already exists';

刪除一個DBF檔案的索引用下面的SQL:

drop index "表名.dbf".zch

在Delphi中執行和Foxpro中一樣的命令:pack all,用下面程式碼:

需用引用Uses DBiTypes,DBiProcs,DBiErrs三個單元

  tbUpdate.Close;

  tbUpdate.TableName:='csfzk.dbf';
  tbUpdate.Exclusive:=true;
  tbUpdate.Open;
  DbiPackTable(tbUpdate.DBHandle,tbUpdate.Handle,nil,szFOXPRO,True);
  tbUpdate.Close;

如果這個DBF檔案包含索引,會把所有記錄連同這個索引檔案CDX一同刪除,這時可以用上面的方法,先建立這個DBF檔案的索引檔案CDX,然後

把這個DBF檔案修改為不包含索引的檔案型別,這時需用索引的操作可以進行,而刪除記錄時也不會把索引給刪除了,豈不一舉兩得!