执行了这句语后(Query1.SQL.Add('delete from "e:\stockacc.dbf"'Query1.ExecSQL;);,如何才能真正删除FOX数据库中的记录。而不仅仅是做个删除标记?谢谢。

解决方案 »

  1.   

    你再看下列代码,或看一下:http://www.codelphi.com/hanyi/jiqiao/112.htmlunit Unit1;interfaceuses
    bde,type
    procedure PackTable(FTable:TTable);//数据库彻底删除=========================
    procedure Tform1.PackTable(FTable:TTable);
    var
    Props: CURProps;
    hDb: hDBIDb;
    TableDesc: CRTblDesc;
    begin
    FTable.Active := False;
    {当数据库打开失败时,这个循环语句能够让用户重试}
    repeat
    try
    ftable.Exclusive := True;
    ftable.Active := True;
    {如果正常打开数据库,则退出循环}
    Break;
    except
    on EDatabaseError do
    if Application.MessageBox('以独占方式打开数据库时,出现错误---重试否?','数据库错误',MB_OKCANCEL + MB_DEFBUTTON1) <> IDOK then
    Exit;
    end;
    until False;
    try
    {Check()用于校正和报告DBI底层错误;DbiGetCursorProps()用于取表光标属性}
    Check(DbiGetCursorProps(FTable.Handle, Props));// 获得表的属性已得到表的类型
    {如果是Paradox 表, 必须调用 DbiDoRestructure,重建数据库结构}
    if (Props.szTableType = szPARADOX) then
    begin
    FillChar(TableDesc, sizeof(TableDesc), 0);
    {从数据表光标获取数据库句柄}
    Check(DbiGetObjFromObj(hDBIObj(FTable.Handle), objDATABASE, hDBIObj(hDb)));
    {设置表的描述结构的Name/Type/bPack属性}
    StrPCopy(TableDesc.szTblName, FTable.TableName);
    StrPCopy(TableDesc.szTblType, Props.szTableType);
    TableDesc.bPack := True;
    {关闭表并调用api}
    FTable.Close;
    Application.ProcessMessages;
    Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
    Application.ProcessMessages;
    FTable.Open;
    end
    { 如果是 dBASE 表, 只需要调用DbiPackTable...}
    else
    if (Props.szTableType = szDBASE) then
    begin
    Application.ProcessMessages;
    check(DbiPackTable(FTable.DBHandle, FTable.Handle, nil, szDBASE, True));
    Application.ProcessMessages;
    end
    {不是dBase和Paradox表}
    else
    raise EDatabaseError.Create('数据库必须是 Paradox 或者 dBASE 类型,才能进行物理删除操作!!');
    finally
    FTable.Active := False;
    FTable.Exclusive := False;
    FTable.Active := True;
    end;
    end;