dbf文件的奇怪情况-请高手指点,解决后给我的全部分。(100分)

  • 主题发起人 主题发起人 kai
  • 开始时间 开始时间
K

kai

Unregistered / Unconfirmed
GUEST, unregistred user!
在vfp6.0 中已建立好一个dbf文件,命名为1.dbf,
用batchmove 把另一dbf文件灌入1.dbf,过程一切正常,dbgrid显示数据正常,
但当再次执行程序后,用dbgrid显示数据时,看不到任何纪录,
但在vfp60中可以打开浏览1.dbf文件,请高手指点。
 
更正:
在vfp6.0 中已建立好一个dbf文件,命名为1.dbf,
query1.sql.Text:='insert into "1.dbf" values(...)
把数据灌入1.dbf,过程一切正常,dbgrid显示数据正常,
但当再次执行程序用dbgrid显示数据时,看不到任何纪录,
但在vfp60中可以打开浏览1.dbf文件,请高手指点。

 
再次执行程序时,query1.sql.text应重写.
 
我发现了问题的所在,但还不知如何解决:
为了程序一直使用1.dbf做过渡表单,我在程序的开头用delete 语句清空了1.dbf,
现在发现此清空在dbgrid中已没有显示,但数据还在,因此vfp60还能看到数据,


现在的问题是如何用sql语句真正清空1.dbf???
 
我不知您使用的是什么Query,BDE或是ADO?
如果Query的数据库支持Commit应该可以真正清空。我想你是
想得到类似VFP中Pack这样的效果吧。
 
正如barton所言
 
delete DBF只是做了删除标记,VFP当然能看到,不过最前面有黑点
 
DELPHI中对DBF做delete,其实跟FOXPRO一样,只是做了删除标记,并未真正删除,
但是在DELPHI中已经看不到了,在VFP中却能看到,不过最前面有黑点。
在DELPHI中,若想真正删除,必须用TABLE构件中的EMPTYTABLE方法,只有它能
真正删除记录,相当于FOX中的PACK。
 
如保PACK一个DBF数据库呢?
function PackTable(Table: TTable): Boolean;
var
Props : CURProps;
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
begin
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE,True));
Result := True;
end
else
raise EDatabaseError.Create('Table必需是dBASE或FoxPro类型');
Table.Open;
end;

在程序中的应用方法:

......

Table1.Exclusive := True;//以独占方式打开
Table1.Open;
while not Table1.Eof do Table1.delete;//删除记录
PackTable(Table1);//PACK表
......

 
 
agree with yck and wind2000
 
g: yck and wind2000

update...
set field=null
然后Delete...
这样全OK了.
 
后退
顶部