PACK(dbf)究竟该如何实现,100分送上(100分)

  • 主题发起人 主题发起人 Dawn7
  • 开始时间 开始时间
D

Dawn7

Unregistered / Unconfirmed
GUEST, unregistred user!
BDE函数DbiPackTable在设置表的Exclusve为True后,调用它也不能进行物理删除,请问
PACK究竟该如何实现?能举一个完全通过了的例子(包括应注意的一些设置等)给我吗?
不胜感激!100分送上!
 
使用方法 packTable(aTable:TTable);
这个packTable函数在完成后会重新生成所有的维护索引并PACK表

// Pack 一个 Paradox 或 dBASE 表
// 表必须是打开的而且是被独占的
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;

begin
// 表是被打开的而且是独占方式打开这样我们可以得到DB HANDEL
if Table.Active = False then
raise EDatabaseError.Create('数据表在压缩之前必须是被打开的');
if Table.Exclusive = False then
raise EDatabaseError.Create('数据表必须以独占方式打开');

// 检测表类型 得到表的各种信息
Check(DbiGetCursorProps(Table.Handle, Props));

// 如果是PARADOX表,必须调用DBIDORESTRUCTURE
if Props.szTableType = szPARADOX then
begin
// 填充结构
FillChar(TableDesc, sizeof(TableDesc), 0);

// 从表的CURSOR HANDLE 得到 DATABASE 的HANDEL
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)
));
// 把表名放到描述区里
StrPCopy(TableDesc.szTblName, Table.TableName);
// 把表类型信息放到描述区里
StrPCopy(TableDesc.szTblType, Props.szTableType);
// 设置表描述区里的PACK 选项为TRUE
TableDesc.bPack := True;
// 关闭表才可以做重结构动作
Table.Close;
// 调用 DbiDoRestructure...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, FALSE));
end
else
// 如果是DBASE表,简单调用DBIPACKTABLE即可
if Props.szTableType = szDBASE then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, TRUE))
else
//PACK动作只能对PARADOX和DBASE表来完成,其他会出错
raise EDatabaseError.Create('数据表类型必须为PARADOX或DBASE表 ' );

Table.Open;
end;

签名档:王xx原创文章,请勿转载
 
注意要引用 BDE 单元
 
王大侠,Foxpro2.x的表怎么办?我用了Halcyon V6.0控件对Fox表进行了Pack,但
Pack后的重建索引不怎么对,你有没有解决办法或是更好的控件介绍给我!不胜感激!
我现在的这个程序在用了一段时间后就会死机,原因就是Fox表索引方面的问题,在Dos下
用Foxpro25进行Pack和Reindex后就一切OK,我是一直没办法在程序中解决这个问题,
企盼你的回答!
 

Similar threads

回复
0
查看
977
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部