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