QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 `8 Q% B( t- z' a- n Delete + ]( x# D9 m. |0 ZMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox $ [8 _; L/ \. i! y& b- `! p 表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 ! A& ^- L- H! n2 v% _2 n - \/ v" C( H+ z! j5 R; x //This function Pack the Paradox table. write by zodiac 4 P. @ m2 e; k) f8 T! j, s1 i void __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) $ C3 x7 h7 B6 o, ?{ 6 l( w) E$ T4 H //Paradox table use a quite different way to be packed than 5 o' X* M1 s5 \0 L. @- K# Q //DBase or Foxpro table, it use the DBiDoRestructure not the 8 ~2 y7 h) c- R, t9 T. E9 `# s // DBiPackTable % U8 d3 _+ b7 M2 S. t6 ] DBIResult rslt; 2 u$ ~. |; y9 S, Z" C7 ` CRTblDesc TblDesc; 0 x9 Z4 _; n( q5 ], o( j8 ]- I- H7 l //filled the structure CRTbiDesc with 0 - |8 s& f b) z: ]! g5 O memset((void *)&TblDesc,0,sizeof(CRTblDesc)); # O T( d/ X! s2 v* ^1 u' g //copy the table name and type to the structure ' [1 Z6 {) T% h! w7 w* i lstrcpy(TblDesc.szTblName,TblName.c_str()); ; C8 K+ q: p1 i/ G8 a# o lstrcpy(TblDesc.szTblType,szPARADOX); : C& k8 L9 c- G# u. z9 ~ h //set bPack to true to specify Pack Function x" k* d9 n9 u7 K" d TblDesc.bPack=true; 8 k& Z. T5 i# N //Pack the table S4 T( u% c6 k, T: g rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); , ]. S/ H& Y7 t if(rslt!=DBIERR_NONE) ) b8 u- ~5 s0 n' E Application->MessageBox("不能压缩表", + T, y' c7 U: t "压缩数据表出错",MB_ICONERROR); 9 f* n8 J( F; D* S } 4 p0 r3 `( Q3 o注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. 3 q1 o$ ^8 M% E . T, I6 R" y$ Z! B0 ` void __fastcall TForm1:ackTable(AnsiString table_name) 6 G* ~# u3 i/ ^ { , t- @' D5 R* V: r& `# G //Pack the table # R) m9 |* V- d3 M5 e, C TTable *temp_table=new TTable(Form1); , N5 h! Y5 C5 J, A2 A temp_table->DatabaseName="YourDatabaseAlias"; * G1 Q! m( r) o/ |3 F( ^ temp_table->TableName=table_name; 8 H0 ?7 c( J! C- [' F8 L& r temp_table->Exclusive=true; ' ~9 C$ Q3 G! R( o) T H temp_table->Open(); 4 c& _9 @7 z7 P6 ` //get the Database Handle ' h$ o. h! [' u$ \ hDBIDb hDB=temp_table->DBHandle; 4 Q: n& `3 U0 ]4 A+ {1 S0 d temp_table->Close(); # k5 b7 I- l1 ]+ ]* _ 5 ?# d' x, [* ~) [8 L5 J( _' r; K PackParadoxTable(hDB,table_name); 3 w) \$ t' p1 G$ y% R4 ^ % y; _8 c9 o: v+ r! d2 v temp_table->Close(); " j' v3 B! g* f) B temp_table->Free(); . l7 L8 [& [& S8 t) b} - d0 C6 s( ` c0 ?- {) @ ' d. o/ x" D% |9 _ 1 w% \& r$ V9 {. m: A V: L1 j+ [ 对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 21:16 , Processed in 0.409272 second(s), 53 queries .

回顶部