我在网站http://www.delphiboy.com/cgi-bin/doc/datacontent.php?no=155上看到有一篇“为Delphi提供Pack和Undelete功能”的文章,别的网站也有类似的介绍,可是依据以下的两种写法的代码还是不能做到“delphi中真正删除dbf数据库中的记录”,原因可能是我以下的疑惑的第3点,在此我想请教一下,非常感谢! 问题:用delphi6删除dbf数据库中软删除记录把未被的软删除记录备份到SQL数据库!(在delphi中用delete 命令删除dbf数据库的记录时,仅 将 记 录 用 星 号"*" 标 记 为 删 除, 实 际 并 没 有从数 据 库 中 进 行 物 理 上 的 删 除,也就是说记录还在。) 环境:win2000、delphi6、foxpro数据库(*.dbf)和SQL2000数据库(字段完全一样) 操作如下:我在delphi用了一个Table(databasename为ODBC的数据库(dbase),tablename为foxpro数据库名(dbf)),用query还是查到所有数据! 代码1(网站上提供): function PackDbfTable( DbfTable : TTable ) : boolean; var errResult : DBIResult; begin if not DbfTable.Exclusive then {如果不是以独占方式,操作失败 } begin result := false; exit; end; {进行删除操作 } errResult := DbiPackTable( DbfTable.dbHandle, DbfTable.handle, NIL, NIL, true );
{根据返回结果,返回成功与否的标志 } if errResult = DBIERR_NONE then {没有错误,操作成功 } result := true else{没有错误,操作失败 } result := false; end; 代码2(您在网站公布的代码): procedure 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类型’); Table.Open; end; 疑惑: 1、如果Table.Active、Table.Exclusive同时为true 无法执行 2、还是无法真正删除dbf数据库的软删除记录(可能是由于以下第3点的原因造成,如何才正确呢?), 3、(代码2)我跟踪显示到Props.szTableType 为“Driver do Microsoft dBase(*.db”,szDBASE为“DBASE”;、(代码1)我跟踪显示到errResult为9990,DBIERR_NONE 为0