到底有人把dbf真正pack过,DbiPackTable不管用!!(200分)

  • 主题发起人 主题发起人 aries
  • 开始时间 开始时间
A

aries

Unregistered / Unconfirmed
GUEST, unregistred user!
头痛死了!数据文件越来越大,记录根本删不掉,在论坛中相关的贴子我都看过了,DbiPackTable使用后没有出错,但文件并不减小,一定要在foxpro等工具打开后才能将其真正pack掉。
我开始用的是bde的foxpro,后来又改为dbase,问题仍然一样!
各位,我出200分了,帮帮忙吧!
 

要Pack DBF表,一定要用独占方式打开才行

Table1.Exclusive:=true;
 
试试独占方式,或者你先用 Database Desktop 试试 Pack一下.
 
我用的代码基本上是这样,肯定数据表是exclusive=true的:

procedure PackTable(Table: TTable);
var
Props: CURProps;
begin
// 必须以独占方式打开
if (not Table.Active) or (not Table.Exclusive) then Exit;
Check(DBIGetCursorProps(Table.Handle, Props));
// 必须是dBase或FoxPro
if Props.szTableType <> szDBASE then Exit;
Check(DBIPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True));
Table.Open;
end;
 
aries 应该可以
如果有问题,告诉我
DBIPackTable肯定可以,我作过
注exclusive=true必须
 
thanks delphifaq,
会不会是这样,我的数据表是在vfp5.0中定义的,而delphi的该函数只认dbase?
换句话说,DBIPackTable适用于所有的*.dbf表吗?
 
应该是有些区别的,这几种DBF各不相同。实际上是在VFP中不相同
 
能具体点吗?
 
问题解决了一半,原来用了一条判断
if Props.szTableType <> szDBASE then Exit;
看来是数据表类型不对,去掉这句后,才真正执行了DBIPackTable,可还是出错:数据被pack了,但索引文件不见了!还返回了错误信息;
难道对索引文件有什么要求吗?(我在database desktop中定义的索引)
 
语法
function DbiPackTable (hDb: hDBIDb; hCursor: hDBICur;
pszTableName: PChar; pszDriverType: PChar; bRegenIdxs: Bool):
DBIResult stdcall;
参数
hDb : hDBIDb 有效数据库句柄,可以用 TDatabase.Handle或 TTable.DBHandle填充
hCursor : hDBICur Cursor
pszTableName : pCHAR 表名
pszDriverType : pCHAR 类型,不过只有一个有效值为 szDBASE.
bRegenIdxs : BOOL 是否重建过期的索引(Index)

注意:
1.通过给出的hCursor或指定pszTableName和pszDriverType都可以进行
正确操作如果hCursor不为nil则pszTableName被忽略。
2.此函数只能对DBASE数据库文件进行操作
3.调用前必须先设置表的Exclusive为True
再看看paradox数据库文件的清理(虽然paradox格式的数据库文件会自动使用
已被删除的记录的物理空间,但某些情况下的清理还是有必要的)

语法
function DbiDoRestructure (hDb: hDBIDb; iTblDescCount: Word;
pTblDesc: pCRTblDesc; pszSaveAs: PChar; pszKeyviolName: PChar;
pszProblemsName: PChar; bAnalyzeOnly: Bool): DBIResult stdcall;
参数
hDb : hDBIDb 有效数据库句柄,同上
iTblDescCount : UINT16 表描述符数目,不过只能为 1
pTblDesc : pCRTblDesc 指向一个很复杂的结构,不过这里只需要其中两个域
szTblName 表名 ATable.TableName;
szTblType 类型 szParadox;
bPack 清理 True;
pszSaveAs : pCHAR nil
pszKeyviolName : pCHAR nil
pszProblemsName : pCHAR nil
bAnalyzeOnly : BOOL False

了解了这两个函数的大概用法,清理表中无用数据就不是什么难事了,
再看看BDE的在线帮助(/Borland Shared/BDE/bde32.hlp)里面相应的
例子就很清楚了。
 
dbase和foxpro区别很大吗?
我的TTable中定义数据表类型为ttfoxpro,问题是不是在这里?
 

URL: http://202.96.137.69/forum/delphi )
中有一遍文章“在DELPHI程序中维护DBF数据库(7千字)
 
何必如此辛苦,如果不懂得使用第三方控件,就不算DELPHI的程序员,向你推荐
一个数据库引擎:APOLLO VCL。它是做本地型数据库程序的最佳选择。当然,
它支持真正的PACK方法,而且另外的好处更多,比如它提供的APOLLOVCLLOCATE方
法简直是棒极了。象ApolloLocate('ltrim(姓名)="lw"',false,false),简单说,完全实现了FOXPRO的LOCATE方法,并有所增强,并提供了记录级的锁定语句RLOCK(),做出来的程序不用BDE就可以运行,这样的不是很好吗。FILTER也可与这样
定,filter:='"陈" $ Name',总而言之,FOXPRO中的函数和过程在APOLLOVCL
中都可以使用,快去下载吧。
http://go.163.com/~hua8hua/
 
先派分吧?我想问题最终会完美解决的
 
多人接受答案了。
 
后退
顶部