QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 - g( C; b9 B9 ~ u/ \Delete ( ?& L7 K0 y6 d9 w1 I; i: `6 lMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox ; R% ^" R8 i0 k9 h* ] 表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 : m# z u3 R6 `7 J, n8 T3 y 1 N% e0 l7 g) R3 O2 o //This function Pack the Paradox table. write by zodiac : r. {) d' k; M0 a; Jvoid __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) ! q: U* ` ^, ~4 u% [ { 3 {0 ^( \. F7 h+ o7 m4 | //Paradox table use a quite different way to be packed than 9 _* r T$ Y, x/ Q+ } //DBase or Foxpro table, it use the DBiDoRestructure not the 1 `" }) \& g, B, Z6 I // DBiPackTable 0 q- i% {; n. q6 h DBIResult rslt; + `6 p1 ^3 b8 ]0 |" T/ ~4 T) c$ O CRTblDesc TblDesc; . r& V0 }/ ~; Z //filled the structure CRTbiDesc with 0 7 G' Y; Z) v; G8 ]! Y6 I9 S memset((void *)&TblDesc,0,sizeof(CRTblDesc)); & z% q5 o) Y* B5 a8 f2 m //copy the table name and type to the structure 9 b* V+ q. W. m7 m% H lstrcpy(TblDesc.szTblName,TblName.c_str()); * q: h3 b* y$ D4 b) G lstrcpy(TblDesc.szTblType,szPARADOX); # F" n% F6 m7 }+ h% l //set bPack to true to specify Pack Function : h( p, p4 h+ _, ~2 M6 M, @ TblDesc.bPack=true; 2 N5 a$ X, a* g/ h) v" y2 M& W( n5 \ //Pack the table 0 g% ?+ g+ Z7 B0 g! r R. a/ N1 ~8 z rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); ) }( Z8 L5 s! E0 `, P6 p/ U( i if(rslt!=DBIERR_NONE) ! G, s x* m! E1 F8 Y Application->MessageBox("不能压缩表", z/ y) m; U7 i2 u M+ X& A# G# b "压缩数据表出错",MB_ICONERROR); : L; J$ j4 P5 Y% J } # Q( u* k7 q( i3 G/ C7 ^9 E9 Q8 r注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. ; N0 n* O. D! A4 I& S8 s" C( H 5 n% D$ c! D- ^8 b, |( l2 Xvoid __fastcall TForm1:ackTable(AnsiString table_name) & j/ W: N) l( v% [; ^) R{ 5 R3 }: ], [0 W, K1 J! m# @. k, U+ ` //Pack the table - x; _; [, b; t: M& h TTable *temp_table=new TTable(Form1); 4 ]9 a! ^7 v+ U Q$ n# i temp_table->DatabaseName="YourDatabaseAlias"; . h( @6 a/ G `! _" J0 t temp_table->TableName=table_name; # O0 ?4 _, e' m3 b temp_table->Exclusive=true; ) O) L8 s' \/ G% q7 {8 y" p temp_table->Open(); 0 e5 D6 _& x1 _ T: H, f //get the Database Handle 9 _" ?% }1 |8 N$ ]1 Q. M# A1 b hDBIDb hDB=temp_table->DBHandle; 6 j/ d Y8 O; x, B) J8 d% M( Q temp_table->Close(); ; {/ T% l w& R& r5 U4 D) i2 G' B 9 G* ` N$ f$ M& n$ |" C4 A2 U PackParadoxTable(hDB,table_name); 7 |3 W, V% z0 C. Y4 h0 `* C) I 9 {$ t c W5 \9 H% D; U9 K9 W temp_table->Close(); 9 x h( P8 a0 I1 M( k temp_table->Free(); 0 S. U( b- u/ Q: X, w} * X! P8 T8 X+ f+ a* i & K _* P: |- j; U- f 5 K% u5 {: b* L4 H 对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-21 20:43 , Processed in 0.432459 second(s), 52 queries .

回顶部