QQ登录

只需要一步,快速开始

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

如何给Table减肥

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

用BCB进行多媒体数据库开发时常会发现这样一个现象,当你把一条记录从表中删除时,表的大小并没有相应减小。这样在进行多次插入删除之后,表文件就会越来越庞大。之所以会有这种现象,是因为TTable控件的 ! I. U a7 n' M# ~$ L' ? Delete $ N' @, L7 m" i0 Z1 DMethod并不真正从表中删除记录,而只是在记录前加上一个删除标志。在DBase和Foxpro中有Pack语句对表进行压缩,但在TTable类中却没有相应的函数。其实在BDE的API函数中已经提供了DbiPackTable来对DBase或Foxpro表进行压缩,但是这个函数对Paradox的表不起作用。要想给Paradox 3 x1 T5 l/ A3 M4 A ^7 F9 Q& K, L0 K1 p 表减肥得用DbiDoRestructure函数来完成,以下例程完成Pack Paradox表的功能。 2 K8 W/ e# C( F* h : k6 O+ S2 }/ n& L+ X //This function Pack the Paradox table. write by zodiac . B* v4 Q$ y/ L W# b! Uvoid __fastcall TForm1:ackParadoxTable(hDBIDb hDB, AnsiString TblName) $ H* [. n5 p+ O' [9 B0 x { 8 o- A1 O& V( p. l1 P) N //Paradox table use a quite different way to be packed than + v V: B' V1 ]: i% H- J6 L( `* Q //DBase or Foxpro table, it use the DBiDoRestructure not the # f9 I2 w3 k4 s: W: R6 C0 D // DBiPackTable + P$ B' X/ |+ o6 B* X. i DBIResult rslt; & z' W3 {* U9 d! V- q: m6 O CRTblDesc TblDesc; - L; G$ S3 t! q: e9 q+ P( Z7 y //filled the structure CRTbiDesc with 0 3 B; w4 P4 K: B0 ~4 E& R memset((void *)&TblDesc,0,sizeof(CRTblDesc)); 6 U' V: o0 n8 k5 M) Q0 I0 B) M //copy the table name and type to the structure ' n+ b" @& ?8 X- {& y* y lstrcpy(TblDesc.szTblName,TblName.c_str()); 6 P% U2 Z# k4 U lstrcpy(TblDesc.szTblType,szPARADOX); % X+ S" a2 N+ g8 Z; `3 s //set bPack to true to specify Pack Function # |( W, I2 H' _. T n- g5 N* Z% a TblDesc.bPack=true; 6 m- C7 _& o5 D9 k# m# i //Pack the table 6 s: Q+ g+ g" }& z- h# F rslt=DbiDoRestructure(hDB,1,&TblDesc,NULL,NULL,NULL,false); 1 z" t! c: |4 y& F4 f if(rslt!=DBIERR_NONE) + Q: y. O" v3 r. k Application->MessageBox("不能压缩表", ! }* i$ q2 s7 W7 G: ^3 ~/ q! R7 z "压缩数据表出错",MB_ICONERROR); ! a' y2 M4 e( T! n$ k6 I) h } . m0 W! W6 f# k4 o9 U注意,在Restructure之前,表必须处于关闭状态。以下例程调用PackParadoxTable. ; s4 n, l! o; @ N# @ " r% H+ ?$ k, J& H1 L- c% Pvoid __fastcall TForm1:ackTable(AnsiString table_name) S3 r8 f |6 Y0 r9 f* o& _: Y { ( z9 ?: Q2 P5 ? //Pack the table # }6 i/ `1 I$ K; z; x TTable *temp_table=new TTable(Form1); & }- L0 \' i0 U2 @6 C) @8 q: R z temp_table->DatabaseName="YourDatabaseAlias"; 1 `1 O) \# @6 D" C0 i temp_table->TableName=table_name; : w6 b6 I9 i" t# B- Y temp_table->Exclusive=true; - ]6 m1 ]/ p5 R: d temp_table->Open(); ; q; E* y1 }% g, ?7 k) \1 h1 s //get the Database Handle , C$ I$ V o( T hDBIDb hDB=temp_table->DBHandle; & Q9 y# b& b' `" H temp_table->Close(); ! `6 G0 e4 l; J, m! G " ?5 `: C# h: w' b0 \ PackParadoxTable(hDB,table_name); 1 S/ f: m4 g& W; X5 Q! r N& w0 E+ M, H5 t8 A temp_table->Close(); . [2 ?# I8 Q# _. l4 T3 V4 A9 { temp_table->Free(); 7 V) ^1 w" ]! J; }0 _' T- a+ t } $ {+ W8 {, |- O( y1 O 2 f) C6 ?3 w2 x; M" Q2 ] C' ~3 h4 |! u 0 s4 s6 A/ [( G* v8 z+ S4 i+ q, g对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-19 21:17 , Processed in 0.430345 second(s), 52 queries .

回顶部