QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 - W# G( D+ N, }5 @4 [Delete * |: B' B y. A+ R5 RMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox ( y" Y: }! E1 \. p; R& r 表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 2 [9 z- h( f6 F+ z9 K6 C 3 Y1 D) q1 y* y4 T; F //This function Pack the Paradox table. write by zodiac ' U% \5 {: |( tvoid __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) 5 |- n% ?0 w6 } { # B2 E/ Q& b2 O; l3 Z //Paradox table use a quite different way to be packed than 5 n6 _. ~- \4 f. Y" U //DBase or Foxpro table, it use the DBiDoRestructure not the 8 I! l% y# F3 o; t, y( h8 X. ?' B // DBiPackTable $ k2 w. u3 f- c# w: [# C DBIResult rslt; 1 q7 [$ ?' ^: F H. O$ j CRTblDesc TblDesc; ) [7 e$ V. I+ I3 o) U, p) h //filled the structure CRTbiDesc with 0 / G( {, Q7 d1 s$ M( H memset((void *)&TblDesc,0,sizeof(CRTblDesc)); . s8 M6 |5 u$ B9 r, J) A //copy the table name and type to the structure 9 y; y4 j% {) s8 `: b) }8 F) B lstrcpy(TblDesc.szTblName,TblName.c_str()); , B/ ?/ O6 ~, F' x1 R' @4 e lstrcpy(TblDesc.szTblType,szPARADOX); % S: P& Y# ?) J) K& A \ //set bPack to true to specify Pack Function 1 `, E3 i" P4 R. u TblDesc.bPack=true; 4 ^+ m# y! p5 ^6 f. ]% ~ //Pack the table * c% ]5 j! i1 j0 i. X: x2 z& \* { rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); - f; C$ j! m7 a, N' x& a g* P& E if(rslt!=DBIERR_NONE) ! V8 M- u% \; u) { Application->MessageBox("不能压缩表", ' G+ P+ i3 I: j. { "压缩数据表出错",MB_ICONERROR); 2 D0 X# Z' K# d" O4 {( M% i; @% q } ( ?3 l9 C& V: a) M注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. & Y9 D! n' b; w" X 0 S; }4 v- R0 I* |( f& s. Jvoid __fastcall TForm1:ackTable(AnsiString table_name) + o7 A! o% x0 [5 a+ ^% [ { 3 w+ o- n1 D6 C9 C" ^: p' s7 h //Pack the table ( `5 z4 Z" ]+ c0 J TTable *temp_table=new TTable(Form1); / s) |( S2 L p% J7 H' H" B1 K temp_table->DatabaseName="YourDatabaseAlias"; 8 [3 T. Y' s/ `+ E) ` temp_table->TableName=table_name; " U! |9 c3 C7 h temp_table->Exclusive=true; 6 Q$ t* y6 M8 G" T! @ temp_table->Open(); 5 \& N/ |- I+ {2 N# ` d( e* ] //get the Database Handle & E2 j& R; l, j. v+ }: x* v hDBIDb hDB=temp_table->DBHandle; ; M3 x A& l% R+ q* }: t temp_table->Close(); # Z U. t7 ~5 L$ i V" R" R! ] ! m5 P6 N7 n* T) Q9 N; k PackParadoxTable(hDB,table_name); % C: W- y8 ^2 O 1 J2 w+ r7 H2 K* v1 }4 }' J temp_table->Close(); h' N, S% Q7 p3 @) a temp_table->Free(); & w7 G6 ]. E1 y/ @! n} 4 m% w/ Z2 S9 B5 a ; d3 N: p0 S; Y& G @( H$ U ' P e' c9 g3 `) a L对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-11 14:12 , Processed in 0.397933 second(s), 52 queries .

回顶部