如何彻底删除DBF文件中的数据记录?(文件的大小要改变!)(100分)

A

aiken

Unregistered / Unconfirmed
GUEST, unregistred user!
  我用了一个DBF的表来记录生产数据,几个月后文件达到110多MB,以致启动程序需要
半个小时左右。
  由于用delete来删除多于十万条时的记录数据,文件里的实际数据也就6、7万条,正
常时文件大概6M左右。
  怎么回事?
 
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
if not Table.Active then
raise EDatabaseError.Create('Table must be opened to pack');
if not Table.Exclusive then
raise EDatabaseError.Create('Table must be opened exclusively to pack');

Check(DbiGetCursorProps(Table.Handle, Props));

if Props.szTableType = szPARADOX then begin
FillChar(TableDesc, sizeof(TableDesc), 0);
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
StrPCopy(TableDesc.szTblName, Table.TableName);
StrPCopy(TableDesc.szTblType, Props.szTableType);
TableDesc.bPack := True;
Table.Close;
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
end
else
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' +
'type to pack');
Table.Open;
end;
 
经常检查库文件,bde函数pack废记录
 
上面的方法是用Bde API,但这种方法可能只能用 dBase 的DBF
对于 visual foxpro ,BDE根本无法支持。更谈不上删除。

Ado 也无法直接支持 dbf 表的物理删除。

你可以用vF 做个程序定期删除,
或用VF做个DLL来实现删除功能,其它程序要删除时直接调用这一功能。我就是这么做的。

但这有个缺点,需要 VF 的运行库支持!
 
我采用建立新表的办法,由用户手动来删除报表文件。谢谢!

with table1 do
begin
Open;
if RecordCount > 100 then //另存报表,建立新报表
begin
first; //取原报表开始记录时间 + to + 结束记录时间
dbf_date:= Table1.FieldByName('时间').AsString;
dbf_name:= datetostr(strtodatetime(dbf_date));
last;
dbf_date:= Table1.FieldByName('时间').AsString;
dbf_date:= dbf_name + ' to ' + datetostr(strtodatetime(dbf_date)) + '.dbf';
dbf_name:= curr_path + '/' + dbf_date;
close;

if FileExists(dbf_name) then DeleteFile(dbf_name);
RenameFile(table1.TableName,dbf_name);
dbf_date:= curr_path + '/savedata/' + dbf_date;
if FileExists(dbf_date) then DeleteFile(dbf_date);
movefile(pchar(dbf_name), pchar(dbf_date));
table1.CreateTable;
end;
end;
 
顶部