QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 6 e; i7 ~$ x: e% R' I) B Delete ' N9 d9 p9 }1 wMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox % [) ]( [/ F- h! C* p$ ~7 c" \表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 * ~5 P$ n7 m$ F6 H% `: z7 F/ T " b$ t7 h, x2 x( r/ e. c9 F9 @; [ //This function Pack the Paradox table. write by zodiac ( F8 s: n5 N* J& Ivoid __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) 4 H& z2 {/ o* } { , J, B( T0 r! @6 ] //Paradox table use a quite different way to be packed than 2 j( w! U* n! c3 w1 M% A7 p //DBase or Foxpro table, it use the DBiDoRestructure not the : h, @' A1 c5 Y7 K // DBiPackTable ) O- b% Y8 c% V+ D$ ~ DBIResult rslt; + D% J/ P4 K, G$ @! p7 h7 g CRTblDesc TblDesc; 7 k! m$ c: y8 ?" r8 p3 i. o //filled the structure CRTbiDesc with 0 % o% X) M8 `* S0 c3 \ memset((void *)&TblDesc,0,sizeof(CRTblDesc)); 2 V2 e+ } m- R8 }8 o1 j, S //copy the table name and type to the structure ; q5 Z: N8 R, D lstrcpy(TblDesc.szTblName,TblName.c_str()); ' V) A/ n9 b/ q# {, E3 f' v: Z lstrcpy(TblDesc.szTblType,szPARADOX); # }+ u$ E' K1 n( A, D; L //set bPack to true to specify Pack Function 1 s" K* ^; R- t4 v# a5 H2 ?1 ] TblDesc.bPack=true; * E; M; Z$ Y" S l //Pack the table 6 w2 a0 k9 F Y" S0 X rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); 3 z1 Y3 e$ m- f/ }& w- O( w- o8 @ if(rslt!=DBIERR_NONE) 9 K6 X& ~: Y: f Application->MessageBox("不能压缩表", 2 O& r9 x, C6 D6 c7 H "压缩数据表出错",MB_ICONERROR); $ |. P3 T6 z4 [/ H0 F8 M} 3 ^2 L; E* g- h/ c' h& z2 w 注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. / f ]3 ~8 o' s. E; G# p / m& L' o# n! z) B; Q void __fastcall TForm1:ackTable(AnsiString table_name) 9 W }1 p& u9 H2 G& L" P { / j' }( \/ A( F7 [5 E //Pack the table & W/ ]3 g" G) \) J# V( M& | TTable *temp_table=new TTable(Form1); 1 V v D: m- w3 I" `8 n8 _: S temp_table->DatabaseName="YourDatabaseAlias"; * m% f ?( ~# t- t4 n! o temp_table->TableName=table_name; $ o) I2 ?* {# Y5 _$ N& A temp_table->Exclusive=true; 8 v1 v: O) m" Z+ x9 Y. G# v temp_table->Open(); 0 G& c4 r& w4 J' J6 x& R8 J& d0 a //get the Database Handle ; E4 l- d: V) _ hDBIDb hDB=temp_table->DBHandle; # a. H7 y/ x; O) V' _: \) | temp_table->Close(); 5 s% h) t) S9 R+ h . E: G) x! {7 [ PackParadoxTable(hDB,table_name); & r5 F1 V m0 |$ j6 B: P o6 r 9 @8 Z% Y" ~9 X' m temp_table->Close(); 2 g! s5 V* s1 e; c temp_table->Free(); 1 W& ?% E4 r+ Z( R2 L } % f C5 a: m) L0 F& s& n2 R 2 \* Y3 k! T# ` 2 x4 T m2 H7 d1 C" Z 对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-18 18:22 , Processed in 0.396833 second(s), 51 queries .

回顶部