QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 $ C/ M+ m* h S0 J& c0 R N1 JDelete 2 v4 a- a8 m6 H" S4 F+ w. m$ cMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox 5 g! o- s6 j* Y: c3 |5 g; ~3 E0 v表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 4 Y% K1 K$ s& C0 u 4 @5 h* Z# n+ ], A! I- C; G" }//This function Pack the Paradox table. write by zodiac 9 V7 h! r: C& _ {; }5 w8 b void __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) : W$ J* Y* \3 j0 K2 B { # ~. L& ]# b3 ?+ X$ s$ l //Paradox table use a quite different way to be packed than 1 j0 ]: q' b% l6 B* `- w; l- D: D r //DBase or Foxpro table, it use the DBiDoRestructure not the ; z- F$ ~' R- S8 U // DBiPackTable ! K* R# U& W. C" @ Z( ?' D3 m+ W: @ DBIResult rslt; . q& n- x8 s+ E& @7 v, `# T1 L CRTblDesc TblDesc; & u- c, \. j! X: l- ~9 a //filled the structure CRTbiDesc with 0 ( E, A. K# g& Z: l memset((void *)&TblDesc,0,sizeof(CRTblDesc)); ! i) x. [6 M) O% \; H //copy the table name and type to the structure " k8 D% o& L* P0 z$ }2 O$ } lstrcpy(TblDesc.szTblName,TblName.c_str()); ' r3 Q- x4 z$ j; D" \ lstrcpy(TblDesc.szTblType,szPARADOX); 6 [/ K( @" }$ c //set bPack to true to specify Pack Function : ?& w" R% }# H TblDesc.bPack=true; $ Y, k5 g# u! L* r; b, b, I- v //Pack the table ; {5 H' o: n5 D# C: b/ a rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); 4 q2 ^# B! c. p# k6 I& ~ if(rslt!=DBIERR_NONE) 3 [ j4 p; U" k/ R7 l Application->MessageBox("不能压缩表", p. ^& _& H. F! L, D "压缩数据表出错",MB_ICONERROR); i# H( V8 j7 A- I) z} 9 |8 E0 u# z4 `% W& k- o注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. & V' X w! Y! j5 k. O ' a* d& p) `' T+ W3 x+ m" Mvoid __fastcall TForm1:ackTable(AnsiString table_name) 1 C- o4 Z3 |8 m* p: U( A7 r( c{ ! w) n$ b' q6 X //Pack the table M$ f- j6 x$ T2 p" w TTable *temp_table=new TTable(Form1); ( d# }" v' t/ l N6 z temp_table->DatabaseName="YourDatabaseAlias"; ! `9 ?/ v: M. y. x; J! l temp_table->TableName=table_name; % h! u* Z1 ]9 W6 \ temp_table->Exclusive=true; $ H" D s! J- h% a2 o. `1 Y temp_table->Open(); * n% u9 O7 @3 m, n/ j //get the Database Handle 5 X9 m- Z- ~# ^" F# [% F hDBIDb hDB=temp_table->DBHandle; ; Y% U/ D; l, P' s temp_table->Close(); ! ~+ }( Z% r0 {; P1 ^* k 9 L+ y. W) t" Z; H+ p5 z PackParadoxTable(hDB,table_name); 5 n% t% `7 w; t+ N% n8 } " h+ } K1 p0 @( Y temp_table->Close(); 0 K o6 N) s- H8 J7 A temp_table->Free(); # f1 x4 d! n) N* a: f. g} * q& Q$ m% y& k; d. o 8 o- B' S' w1 b: V: d, t& i( r; W # \, f8 s+ V8 r7 ]3 K) i. {+ b对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 12:06 , Processed in 0.363723 second(s), 52 queries .

回顶部