QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 ! l7 C& L. A; g0 j5 t Delete 0 m: n1 Z. h: W. q0 o Method并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox % o3 g) n% D( M8 p; ?4 _) Z( w表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 ( U3 m2 S" k& O7 u2 l G) x& J4 E: ~ $ g1 B3 m! n/ Z2 d//This function Pack the Paradox table. write by zodiac , }8 s9 K* W% r/ J+ \4 i0 t- I- ~void __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) ! l; J& A/ h8 f' @# ^! @* g) }0 f{ " b& R p+ S1 d3 B, j //Paradox table use a quite different way to be packed than . W" t4 y( a% O& {+ _# X4 G. [; Z3 I0 \ //DBase or Foxpro table, it use the DBiDoRestructure not the . c+ ` T5 Y+ x1 h3 n // DBiPackTable 6 e3 I9 ]5 G+ d+ }7 I6 z8 T DBIResult rslt; ' M, \5 n% M& v7 v8 K& V6 N# W$ P! V CRTblDesc TblDesc; : O% \5 ~+ G! c' }2 o- h //filled the structure CRTbiDesc with 0 ( @6 i+ _3 I7 O6 V6 X; j memset((void *)&TblDesc,0,sizeof(CRTblDesc)); ; ^$ N/ y1 p( t5 ]3 x2 Y* F; S! y //copy the table name and type to the structure ! U3 n. `2 y' s/ J' L+ h! w8 X7 w lstrcpy(TblDesc.szTblName,TblName.c_str()); , d8 A: N' [8 o' ?) ~; l( s3 k lstrcpy(TblDesc.szTblType,szPARADOX); ! Z3 E. t* e/ q5 U* U8 V //set bPack to true to specify Pack Function ) k9 S1 [3 A/ {& j) k, A. } TblDesc.bPack=true; & |' n, h J8 U9 ]8 }( Z* l, a //Pack the table * a# \) Y6 F: }9 Q: C& h" l# s0 d rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); ; K6 N( r T; q4 f+ I A if(rslt!=DBIERR_NONE) ' w8 s: l# U& N9 G2 P4 r" k3 N Application->MessageBox("不能压缩表", 2 O/ _0 m2 P4 j4 ? "压缩数据表出错",MB_ICONERROR); - Q$ L7 M* o4 {# P} ) A) j' U9 T$ t8 a h; C6 P z注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. $ W: P( s4 Q' B B. T8 H1 P) R + j5 o2 _3 ^0 J, l' R4 M/ Y; F void __fastcall TForm1:ackTable(AnsiString table_name) 0 i+ p& u2 v5 i) g1 V. Q* m { * a7 b4 R( _, u; i //Pack the table 7 L$ t4 e" I" b TTable *temp_table=new TTable(Form1); ) O: D* v. ]5 i, {8 u! E& P1 D temp_table->DatabaseName="YourDatabaseAlias"; 5 O. ^9 a: o' B temp_table->TableName=table_name; $ _% R3 a. Y' n4 t6 f temp_table->Exclusive=true; : X, a+ n. u1 o: W: \ temp_table->Open(); $ [" I) g# W0 {; X& }8 } //get the Database Handle 9 g: R+ @ ~7 I hDBIDb hDB=temp_table->DBHandle; 6 I) J& B) C$ x% u$ ~) X* j/ h; Y3 | temp_table->Close(); : w# T( L5 b# z w }) ~: T * q+ x2 J: H/ V8 ~- ` PackParadoxTable(hDB,table_name); ' ]; {6 V0 h3 r& H& A & w0 U1 r y1 W8 F. n( A temp_table->Close(); ' X4 w$ A$ v2 ~& W8 x8 k temp_table->Free(); 1 f6 h \$ {( K$ \4 ^. ?2 j F} ( h$ w; X2 _' Q+ w# o- v3 F & y( K% l, Y' |- R; L $ f' \, @$ g& `" i5 s: ?" A 对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-8-25 08:38 , Processed in 0.314294 second(s), 52 queries .

回顶部