我发现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文件修改为不包含索引的文件类型,这时需用索引的操作可以进行,而删除记录时也不会把索引给删除了,岂不一举两得!