记录的删除问题(dbipacktable函数)(100分)

  • 主题发起人 主题发起人 berg
  • 开始时间 开始时间
B

berg

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi的帮助文件中,给了物理删除记录的一个函数
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
if not Table.Active then
raise EDatabaseError.Create('Table must be opened to pack');
if not Table.Exclusive then
raise EDatabaseError.Create('Table must be opened exclusively to pack');
Check(DbiGetCursorProps(Table.Handle, Props));
if Props.szTableType = szPARADOX then begin
FillChar(TableDesc, sizeof(TableDesc), 0);
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
StrPCopy(TableDesc.szTblName, Table.TableName);
StrPCopy(TableDesc.szTblType, Props.szTableType);
TableDesc.bPack := True;
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
end
else
// If the table is a dBASE table, simply call DbiPackTable...
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
// Pack only works on PAradox or dBASE; nothing else...
raise EDatabaseError.Create('Table must be either of Paradox or dBASE ' +
'type to pack');
Table.Open;
end;

我设置了table1的属性:exclusive为true; 并设置了他的databasename和tablename
但不管我设置table1的tabletype为ttfoxpro还是设置为ttdbase,ttdefault都会出现
'Table must be either of Paradox or dBASE ‘的提示,不知道我的设置哪儿有错,
该怎么设置!
 
只有Paradox或dBASE的表才能使用PackTable。现在关系数据库已没有物理删除记录的
概念了,只要delete就可以。删除记录可以用数据库工具压缩数据库。
 
1.你的表如果不是Paradax/dBASE格式,不能设置tabletype为ttfoxpro
还是设置为ttdbase.
2.只有Paradax/dBASE可以用物理删除记录的函数。
 
我的表是vfp!我该怎么设置?
 
没有人回答吗?
我查过了以前的帖子,好象别人这样的问题都解决了啊,
我用了相同的方法却不能解决,望高手指点!
 
实在急着用,望高手指点一二
 
真的没人愿意回答吗?
 
我可以另外开帖子再加分,有人愿意回答吗?
 
有人救救我吗?
 
这个问题是vfp和pardox的删除函数是不一样的,请查帮助,
还有以前的贴应该有的
 
delphi帮助上写的关于dbf格式的数据库的pack 和undelete功能就是这样写的啊
vfp的格式就是dbf的啊,我真的不明白了!
 
再往前提提
难道还没人回答吗?
 
你先把Table1的TableType属性设置成ttFoxPro,然后再调用试试看!
 
sorry,没细看题目,你好像已经设过了 :-( ,我再看看!
 
又看了一遍帮助,好像它不支持对vfp的表进行pack。
旧帖也看了看,也没有人成功啊。估计Bde函数没法支持vfp的Pack!
 
难道就没有人碰到同样的问题吗?
 
我看到一下帮助里有这样一段话说明dbitablepack函数用法的:
Usage
dBASE or FoxPro: dBASE and FoxPro let users mark a record for deletion (as opposed to actually removing it from the table). The only way to permanently remove marked records is with DbiPackTable.
Paradox: This function is not valid for Paradox tables. Use DbiDoRestructure with the bPack option, instead.
SQL, Access: This function is not valid for SQL or Access tables.

这应该是说此函数只是对dBASE or FOXPRO有效,对Paradox要用bPack option代替,不知道bPack option是什么?

对于记录的删除,你用TQuery执行“pack tablename”(tablename是你的数据表名)就可以了,例如要pack表users:
query.close;
query.sql.clear;
query.sql.add('pack users');
query.sql.prepare;
query.sql.execsql;
 
procedure Tfrmprocomputer.PackTable(Table: TTable);
var
Props: CURProps;
//hDb: hDBIDb;
begin
if not Table.Active then
raise EDatabaseError.Create('Table必需已经打开');
if not Table.Exclusive then
raise EDatabaseError.Create('Table必需以独占方式打开');
Check(DbiGetCursorProps(Table.Handle, Props));
if (Props.szTableType = szDBASE) then
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True))
else
raise EDatabaseError.Create('Table必需是dBASE或FoxPro类型');
showmessage('彻底删除记录!');
Table.Open;
end;
这段函数我试过,可以把整个表做了删除标记的记录全部pack
 
后退
顶部