先祝各位节日快乐!俺用delphi+dbase做了个程序,牵扯到一个系统挂帐的表,里面数据需要经常存盘和删除,但table.delete只能做逻辑删除,而不能做物理删除。(我用foxpro打开表,删除的记录都还在,只是加了删除标记)特此请教各位怎么才能把里面的数据彻底删除呢????

解决方案 »

  1.   

    不会吧,我做的就全删了。没有处理啊,
    对了,我用的navigator,不是用的代码
      

  2.   

    uses BDE;
    DbiPackTable()可以压缩dbase数据库的有删除标志的记录。
      

  3.   

    请问楼上,dpipacktable()是什么,函数吗??还是方法??我具体应该怎么用呢????谢谢…………
      

  4.   

    to ahuige(灰不遛秋):你做的绝对不是物理删除。
    to zzzl(早安的空气):SQL语句,没用的。
    to love4myxsg:dpipacktable函数有时候会有不能正确识别数据库类型的问题。
      

  5.   

    Delphi带的例子:Example 1: Pack a Paradox or dBASE table.This example will pack a Paradox or dBASE table therfore removing already deleted rows in a table. This function will also regenerate all out-of-date indexes (maintained indexes). This example uses the following input:  PackTable(Table1)The function is defined as follows: // Pack a Paradox or dBASE table
    // The table must be opened execlusively before calling this function...
    procedure PackTable(Table: TTable);
    var
      Props: CURProps;
      hDb: hDBIDb;
      TableDesc: CRTblDesc;
    begin
      // Make sure the table is open exclusively so we can get the db handle...
      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');  // Get the table properties to determine table type...
      Check(DbiGetCursorProps(Table.Handle, Props));  // If the table is a Paradox table, you must call DbiDoRestructure...
      if Props.szTableType = szPARADOX then begin
        // Blank out the structure...
        FillChar(TableDesc, sizeof(TableDesc), 0);
        // Get the database handle from the table's cursor handle...    Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
        // Put the table name in the table descriptor...
        StrPCopy(TableDesc.szTblName, Table.TableName);
        // Put the table type in the table descriptor...
        StrPCopy(TableDesc.szTblType, Props.szTableType);
        // Set the Pack option in the table descriptor to TRUE...
        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;
      

  6.   

    我的解决方法:使用ADO,用里面的ADOCOMMAND控件,直接在里面输入pack tablename.
    前提:做改操作前请先断开与数据库的连接,操作结束后再重新连接上.
    不过我始终认为用delphi操作dbase或foxpro的数据库很不方便,就因为删除数据的问题.
      

  7.   

    谢谢楼上诸多高人,兄弟感激不尽。谢谢lzf1010(深宇) ,俺是初学,以后可能还要麻烦你……谢谢!!!
      

  8.   

    to newfang(方方):
    我非常非常的痛恨dbase和foxpro,我以后都不会再用这些数据库的了,建议你也不要使用这些数据库了,随着数据量的增大和使用时间的增长,还会出现其它一些无法解决的问题的,劝你还是用别的数据库吧。
      

  9.   

    to newfang(方方):
    我非常非常的痛恨dbase和foxpro,我以后都不会再用这些数据库的了,建议你也不要使用这些数据库了,随着数据量的增大和使用时间的增长,还会出现其它一些无法解决的问题的,劝你还是用别的数据库吧。
      

  10.   

    to newfang(方方):
    我非常非常的痛恨dbase和foxpro,我以后都不会再用这些数据库的了,建议你也不要使用这些数据库了,随着数据量的增大和使用时间的增长,还会出现其它一些无法解决的问题的,劝你还是用别的数据库吧。