QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 8 v" R% f0 c: ^% P" N+ PDelete 8 W& g$ N! ]( B9 b/ N& t% T' e8 ?Method并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox " e/ J* {* Z! k/ I8 T( L表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 8 V4 g* X; \+ X3 w5 M : D3 L8 [0 c- ~. ?) _1 \& \- H& h//This function Pack the Paradox table. write by zodiac 1 L( ^+ T8 Y, v/ M+ l void __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) # y9 i. m8 O3 {# ^" Z, P, o { 8 D# W1 E2 o1 Q1 n# }) p //Paradox table use a quite different way to be packed than ( M5 G+ b: s9 a, b+ y$ } //DBase or Foxpro table, it use the DBiDoRestructure not the 8 M8 m) C! N2 z" a. M // DBiPackTable . B5 K# s$ ]6 O5 R( c1 J DBIResult rslt; * Z; S$ L2 q8 V; v q! Q CRTblDesc TblDesc; ; |: ?$ M2 ~. b" f //filled the structure CRTbiDesc with 0 . L" r' Z: F& s* o7 p* c memset((void *)&TblDesc,0,sizeof(CRTblDesc)); ! Y: w1 N5 X& r) [) V T9 w //copy the table name and type to the structure & Q0 x; Y8 U& {+ g, A lstrcpy(TblDesc.szTblName,TblName.c_str()); ! Q* A0 H! X# X8 r lstrcpy(TblDesc.szTblType,szPARADOX); 7 ^* M1 ]+ y7 h$ Y4 m //set bPack to true to specify Pack Function * Z% C- ]* c6 x" i" e TblDesc.bPack=true; / L+ P0 P' t. w5 R$ a3 M5 b //Pack the table ! p1 q5 k& v. |# c$ X1 I; Z4 o; C rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); , M1 s G. a! ~6 v3 M3 Q if(rslt!=DBIERR_NONE) ) R$ S2 N9 v* F. p$ o Application->MessageBox("不能压缩表", & w/ }( t1 X* l. S "压缩数据表出错",MB_ICONERROR); - K& U, M2 y" ?, Y3 ^3 O3 U; [' C* F } 4 b7 I: e4 C" V3 `0 M7 k注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. % m( C$ f7 L T" i: @1 ~! f5 \ 7 {+ l( a0 M* ]9 s void __fastcall TForm1:ackTable(AnsiString table_name) 6 Q: Z2 h: r* k2 l{ , H- t4 m; c8 U( x" n$ J //Pack the table 9 A0 \6 ]: ]) M0 ]( z TTable *temp_table=new TTable(Form1); ( B8 w5 y8 z& w" V, w& n$ ~ temp_table->DatabaseName="YourDatabaseAlias"; " e0 d, {$ _. `% o& r' [ temp_table->TableName=table_name; , L/ @1 b$ y" f temp_table->Exclusive=true; ) q( }+ r& R! t9 X0 C! ]( z temp_table->Open(); 2 ^" W/ A- D+ f //get the Database Handle ' L/ M) T8 o* z. I, o hDBIDb hDB=temp_table->DBHandle; ' }: O. Q) P1 _: J7 u; H ?8 g temp_table->Close(); : k" d, |5 G& o# Y7 m* T1 x 8 s! u6 A* p4 K* N$ A PackParadoxTable(hDB,table_name); $ D7 F8 Z4 |5 @) a! T( w; Y3 |; L . Q3 f: v: W+ F* h2 R temp_table->Close(); 5 z5 G9 t6 O$ w1 ?' ? temp_table->Free(); ; x! X* d# i7 N} , V0 C( I( `& P! C( O9 f/ B 8 N+ q& _' c9 X G/ q * X6 c8 E* H, o2 `对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-10 13:30 , Processed in 0.411410 second(s), 52 queries .

回顶部