你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
在Delphi 中实现PACK功能
 

Delphi 具有强大的数据库功能,用Delphi编写过数据库程序的朋友们,不知注意到没有,使用Delphi的数据集元件的“Delete”方法删除表中的记录之后,表的大小并没有改变,即删除的记录没有被物理删除。可是Delphi的数据集元件没有提供物理删除记录的方法,类似于FoxPro中的PACK函数功能。是不是Delphi没有提供实现PACK功能的函数或过程呢?其实不然,在Delphi中可以通过调用BDE函数:DbiPackTableDbiDoRestructure来实现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,Form1FormCreate事件中添加如下代码:

procedure TForm1.FormCreate(Sender: TObject);

begin

   Table1.Active: =True;

end;

 

第三步,双击Button1,Button1Button1Click事件中添加如下代码:

procedure TForm1.Button1Click(Sender: TObject);

begin

  Table1.Delete;                        //删除表中的当前记录

end;

 

第四步,双击Button2,Button2Button2Click事件中添加如下代码:

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函数,用法也不一样。对于SQLAccess数据库,这两个函数都是不适用的。使用Delphi开发数据库程序的朋友们,不妨试试,在你开发的数据库程序中加入PACK功能,给数据库“减减肥”。以上程序在Delphi 4Delphi 5开发环境,中文Windows 98操作系统下调试通过。

 

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089