真正删除记录?(50分)

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

bobiy

Unregistered / Unconfirmed
GUEST, unregistred user!
  在Delphi程序中,用TTable或TQuery构件的方法Delete执行删除记录的操作时,执行的是软删除,即相当于Foxpro中的"Set Delete Off"的效果,仅将记录用星号"*"标记为删除,实际并没有数据库中进行物理上的删除.要进行真正的删除,需要进行Pack Table的操作.
  在Delphi程序中真正删除记录,需要调用BDE函数,函数名为DbiPackTable,函数原型为:
function DbiPackTable ( hDb : hDBIDb;hCursor : hDBICur; pszTableName : PChar;pszDriverType : PChar; bRegenIdxs : Bool ): DBIResult;
Table必须以Exclusive=True的方式打开.
但我在D4下却无法删除数据, 不知为何?
 
procedure TFpack.pkDBLLBoxClick(Sender: TObject);
var
Props: CurProps;
hDb: hdbiDb;
TableDesc: Crtbldesc;
databasename:string;
begin
databasename:=pkTable1.FieldbyName('basename').asstring;
pkTable2.TableName:=ConCat('c:/royal98/',TrimLeft(databasename),'.dbf');
// select Pack data base
pktable2.Close;
pktable2.Exclusive:=True;
pktable2.Open;
if not pktable2.Exclusive then
raise EdatabaseError.Create('Must be open exclusively to pack');
check(Dbigetcursorprops(pktable1.Handle,props));
FillChar(TableDesc,sizeof(Tabledesc),0);
check(DbiGetobjfromobj(hDbiobj(pktable2.Handle),objDatabase,hDbiobj(hdb)));
strpcopy(TableDesc.szTblname,pktable2.tablename);
strpcopy(tabledesc.sztbltype,props.sztabletype);
tabledesc.bpack:=True;
pktable2.close;
check(Dbidorestructure(hdb,1,@tabledesc,nil,nil,nil,false));
pktable2.exclusive:=False;
pktable2.Open;
showmessage('Packing successful');
pkselect.Enabled:=True;
pkpackall.Enabled:=True;
pktable1.Close;
pktable2.Close;
end;

procedure TFpack.pkExitClick(Sender: TObject);
begin
Screen.cursor:=crdefault;
pkTable1.Close;
pkTable2.Close;
close;
end;
以上代碼D4下run無問題.
 
你用的是什么数据库?
 
用sql可以
 
我有一个demos,是专门用来Pack数据库的,你的E_Mail是什么?
我的E_Mail是:fstao@126.com
 
我也想知道这方面的知识。
zhangc@moe.edu.cn
 
请注意查收邮箱。
 
用TQuery控件时,最好用SQL语句删除记录,格式如下:
with query1 do
begin
close;
sql.clear;
sql.text:='delete 表名 where 条件';
execsql;
end;
保证删除的了记录
 
接受答案了.
 
懶虫的方法,我试过,可行 ,但有一点问题,如果该数据库有备注型字段,就会有问题。我用foxpro的数据库,用上述方法,可以彻底删除记录,删除后用foxpro打不开此数据库。
 
lxm: 用function DbiPackTable( hDb : hDBIDb;hCursor : hDBICur;
pszTableName : PChar;pszDriverType : PChar;
bRegenIdxs : Bool ): DBIResult;试试!!!
我在别的网上看到的,他说有用,可我运行了却好像没有效果,也许是研究不够吧!
 
后退
顶部