QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 ) Z/ S% h2 }% D, n' h$ ] Delete ! m. s# Y4 H tMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox 7 w4 o# i; ?( N表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 / T* x% |( C( `3 { 4 W* A# |7 R' a& F- ~ //This function Pack the Paradox table. write by zodiac / A5 ]" v$ _# Y. j1 }- Bvoid __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) 2 t, z3 T+ [7 v8 q. e& s { : D0 z7 { h5 R2 }7 \ //Paradox table use a quite different way to be packed than , O2 V6 u" l/ Q( R0 L1 B) E) C8 U //DBase or Foxpro table, it use the DBiDoRestructure not the $ N! m+ _$ ^) E; Y4 \1 u // DBiPackTable ( ?4 {: `: E0 E* I; j; c7 I1 n0 E# i DBIResult rslt; ( ~$ m0 z3 M" A* K. w0 | CRTblDesc TblDesc; 5 K" {3 r9 p4 k //filled the structure CRTbiDesc with 0 V i6 m$ {" M& c memset((void *)&TblDesc,0,sizeof(CRTblDesc)); # Y) X5 L$ z3 \ //copy the table name and type to the structure ! Q0 u4 A% f: E5 i5 S lstrcpy(TblDesc.szTblName,TblName.c_str()); . }" q2 T: g/ ^1 Q* H) ^ lstrcpy(TblDesc.szTblType,szPARADOX); / r7 O7 g, |, _7 P0 G7 g //set bPack to true to specify Pack Function 7 g# o; J. ^7 m& K0 S Z6 T: F TblDesc.bPack=true; - l5 W8 D4 Q. k6 L7 m& p# o //Pack the table . O$ A: K- Y, e$ J; H% A rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); $ t. L, ^% Y- O M if(rslt!=DBIERR_NONE) : a0 _ O/ A0 `/ u% X9 q, A Application->MessageBox("不能压缩表", ! x# |7 R o+ x8 y+ ~( V4 T8 g "压缩数据表出错",MB_ICONERROR); & b0 B; K1 g2 M7 e$ v" U/ W/ } } ! ^# \; j. \+ O, ~ 注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. 4 |6 O6 A0 j( Y% r; E8 v6 b $ [, c6 D L9 y1 e9 Z, {) J void __fastcall TForm1:ackTable(AnsiString table_name) 8 [3 i$ s* M2 N7 A" J, u{ " ~7 k: U+ S7 f- } //Pack the table % } N7 F# }( Z# E! D: d TTable *temp_table=new TTable(Form1); # b }2 c) }9 }$ Q' K' v temp_table->DatabaseName="YourDatabaseAlias"; / u6 P" w" Q3 {" W temp_table->TableName=table_name; 9 c I% b' f8 L! E% ? |2 L& A4 l temp_table->Exclusive=true; ' C( W7 B' y( X3 A, N9 ^# r temp_table->Open(); & M* g4 D. F5 b5 d8 U* S2 T+ ? //get the Database Handle / ~0 b! j& m: h: e% K8 ^" Z- s hDBIDb hDB=temp_table->DBHandle; " K# B* n# k& F+ B* k3 }" W4 b0 F temp_table->Close(); " `; I7 f) K7 C9 k0 T2 M ; ?6 }9 |3 }% m! O0 e PackParadoxTable(hDB,table_name); ! O3 c8 @% b+ z( r 3 w7 K! w5 q( {/ }& ?2 A2 ^ temp_table->Close(); ( j' }% z+ x# }( w temp_table->Free(); 3 I" J {0 E) Q& X2 g) i8 L } ' E( |9 e" s! p& A7 A3 s4 R - J6 T' \# Z b: m/ s5 x & Y6 |* V, ?6 `" s/ b/ l S; ?' e 对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-10-18 01:52 , Processed in 0.484458 second(s), 52 queries .

回顶部