QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2480|回复: 0
打印 上一主题 下一主题

如何给Table减肥

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 12:36 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 : J$ s3 r8 s7 v3 U! K/ y: PDelete ' Z+ t: [# _- m1 V. V9 T& BMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox ( u8 E2 l0 R# [- j- x1 b表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 + G' P+ i) z: j: G' W# C 7 o' n( u3 E6 g9 ~5 t/ s//This function Pack the Paradox table. write by zodiac 9 X9 I6 _. w* m: ]! n$ B/ k. H V void __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) ( ?# n" J1 ]! o7 T{ ( X0 b0 h3 ]* Y& V* p //Paradox table use a quite different way to be packed than / ]" ~* y& p# {- X5 V# {4 x& f //DBase or Foxpro table, it use the DBiDoRestructure not the ( d) O, }% R0 Y: J# M* A // DBiPackTable p( U- j2 Y4 u; [* m DBIResult rslt; ' J9 q/ }7 N! U( l. h) x CRTblDesc TblDesc; 8 n$ B3 r% t+ s) Y5 i //filled the structure CRTbiDesc with 0 , j& X) o2 Z+ D3 S memset((void *)&TblDesc,0,sizeof(CRTblDesc)); t R7 s9 ?- u$ F# o% I7 V" ~ //copy the table name and type to the structure 9 `6 _% G B6 ^3 X* L lstrcpy(TblDesc.szTblName,TblName.c_str()); , ~, Z$ N: i8 |2 {$ n4 i H& [ lstrcpy(TblDesc.szTblType,szPARADOX); $ t* @/ ]3 F& I& T. I7 O //set bPack to true to specify Pack Function : L( o0 M. c z TblDesc.bPack=true; . v- f7 t6 _% Y+ H6 F7 H K) [ //Pack the table 9 C, D8 |! e: a2 n1 F& Q& P rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); ( [* }: f8 b( |+ j, y* `, O if(rslt!=DBIERR_NONE) - f. Y' S5 o% ^0 z* L Application->MessageBox("不能压缩表", 4 G7 e: L) J+ L* S3 E "压缩数据表出错",MB_ICONERROR); % a1 @3 k5 T+ I, [9 l} , B6 Y. b1 N9 [$ q注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. / k( d" [5 X* u7 B! R/ H# ? _ . M* v* e1 D" e. K I+ Ivoid __fastcall TForm1:ackTable(AnsiString table_name) ( o" n9 y! Q2 T. A6 K, {1 ?( y/ S { $ A( a5 l- o" q7 u7 |9 d1 J //Pack the table & b* s( T* Q# \ TTable *temp_table=new TTable(Form1); , z" x* ~: ]' | A! n! _: } \$ h6 w temp_table->DatabaseName="YourDatabaseAlias"; ! A- \1 _- ~4 J temp_table->TableName=table_name; 4 e+ @! S& Z2 B+ ?+ {" r' s temp_table->Exclusive=true; 7 O$ b/ h. l) ^. Q temp_table->Open(); 6 [9 s: J# V$ E4 P: V" }. [0 V) N //get the Database Handle ! G' O: `; p- N# A, j( d8 G' F hDBIDb hDB=temp_table->DBHandle; 3 O6 d3 ]; U. } temp_table->Close(); / a* N. w9 Z; K; U# { ' T5 v: G( j. P5 m PackParadoxTable(hDB,table_name); 5 i: D' U4 s3 W$ ?0 e 1 f3 b& Z; ~4 f; Y# @. @2 b5 Y- c temp_table->Close(); A, x- P, u) {$ s' } temp_table->Free(); ! R+ c3 r: v0 o% X5 h& I% T9 j} 5 _& j" r4 h l6 z J$ \ 7 ]5 U1 V5 \ Y9 e 6 Z, C$ Q3 E! n/ [& M+ _对Foxpro和DBase的Pack参见BDE API Help的DbiPackTable函数说明。

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-20 05:58 , Processed in 0.439386 second(s), 52 queries .

回顶部