Delphi 具有强大的数据库功能,用Delphi编写过数据库程序的朋友们,不知注意到没有,使用Delphi的数据集元件的“Delete”方法删除表中的记录之后,表的大小并没有改变,即删除的记录没有被物理删除。可是Delphi的数据集元件没有提供物理删除记录的方法,类似于FoxPro中的PACK函数功能。是不是Delphi没有提供实现PACK功能的函数或过程呢?其实不然,在Delphi中可以通过调用BDE函数:DbiPackTable或DbiDoRestructure来实现PACK功能。下面是一个实现PACK功能的例子。
首先,打开Delphi集成开发环境,新建一个工程Pack.dpr。在Form1对应的单元文件Pack1.pas中的USE部分加入BDE单元,并在Form1上放置如下几个元件并设置元件的属性:
Button1: TButton;
Button2: TButton;
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
元件的属性设置如下:
Form1.Caption:=’Pack Table’;
Button1.Caption: =’Delete Record’; Button2.Caption: =’Pack Table’;
Table1.DatabaseName:=’.\’; Table1.TableType: =ttDBase;
Table1.TableName: =’products.dbf’;
DataSource1.DataSet: =Table1; DBGrid1.DataSource: =DataSource1;
第二步,双击Form1,在Form1的FormCreate事件中添加如下代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Active: =True;
end;
第三步,双击Button1,在Button1的Button1Click事件中添加如下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.Delete; //删除表中的当前记录
end;
第四步,双击Button2,在Button2的Button2Click事件中添加如下代码:
procedure TForm1.Button2Click(Sender: TObject);
var
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
if Table1.TableType=ttDBase then //DBase表
with Table1 do
begin
active: =false;
Exclusive: =true;
active: =true;
check(DbiPackTable(DBHandle,Handle, nil, szDBase, True));
//PACK数据库
active: =false;
exclusive: =false;
active: =true;
end;
if Table1.TableType=ttParadox then //Paradox表
with Table1 do
begin
active: =false;
exclusive: =true;
active: =true;
FillChar(TableDesc, sizeof(TableDesc), 0);
DbiGetObjFromObj(hDBIObj(Handle), objDATABASE, hDBIObj(hDb));
StrPCopy(TableDesc.szTblName, TableName);
StrPCopy(TableDesc.szTblType, szPARADOX);
TableDesc.bPack := True;
active: =false;
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False)); //PACK 数据库
active: =true;
end;
end;
在运行程序之前,先打开资源管理器,查看并记住products.dbf文件的大小,然后运行程序,products.dbf表中的数据就显示在DBgrid1中。连续按几下“Delete Record”按钮,删除表中的几条记录,再在资源管理器中查看products.dbf文件的大小,可以发现文件大小没有改变,然后回到程序,按一下“Pack Table”按钮,再打开资源管理器,查看products.dbf文件的大小,可以发现文件变小了,表明第一次删除的记录已被物理删除了。
最后说明一点:对于DBase表,使用DbiPackTable函数来PACK数据库,而对于Paradox表,则使用DbiDoRestructure函数,用法也不一样。对于SQL、Access数据库,这两个函数都是不适用的。使用Delphi开发数据库程序的朋友们,不妨试试,在你开发的数据库程序中加入PACK功能,给数据库“减减肥”。以上程序在Delphi 4和Delphi 5开发环境,中文Windows 98操作系统下调试通过。
|