function dbipacktable(hDb:hDBIDb;hCursor:hDBICurl;pszTableName:Pchar;
pszDriverType:PChar;bRegenIdxs:Bool);DBIResult stdcallDelphi开发人员指南有个例子,发到你信箱。

解决方案 »

  1.   

    hxshanji(山鸡) 我也要
    [email protected]
      

  2.   

    query1.sql.add('delete "*.dbf" where 1= 1');
    query.sql.execsql;
    ==========================
    这样不可以吗?
      

  3.   

    // 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;
      

  4.   

    To wangxd1976(西门吹雪):   为什么我用的时候总出现'CURProp','hDBIDb','CRTblDesc'没定义呢?
    要加入什么单元文件吗?  
      

  5.   

    ---- 由 于Delphi 开 发 的 易 用 性 和 快 速 性, 很 多 原 来 使 用Foxpro 和Visual Foxpro编 程 的 程 序 员 转 向 了Delphi . 但 由 于 工 作 上 或 其 它 的 原 因, 原 来 的 应 用 系 统 尤 其 是 应 用 数 据, 不 可 能 被 一 下 丢 弃, 因 而 需 要 用Delphi 来 维 护xBase 数 据 库 的 应 用 系 统 . 本 文 总 结 了 在 工 作 和 学 习 中 的 经 验, 与 广 大Delphi 程 序 员 和 爱 好 者 共 享 . 
    ---- 在 下 面 讨 论 中, 主 要 应 用 了BDE 的 函 数 .Delphi1.0 没 有 提 供BDE 函 数 的 帮 助 文 件, 请 参 见 DelphiDoc 中 的DbiTypes.int、DbiProcs.int 和DbiErrs.int 三 个 文 件; 在Delphi3.0/4.0 中 可 参 见BDE 帮 助 文 件 . 本 文 讨 论 的DBF 数 据 库 操 作 主 要 有: 真 正 删 除 记 录、 显 示 被 删 除 记 录、 获 取 当 前 记 录 号、 设 置 查 询 匹 配 方 式、 恢 复 被 删 除 记 录 . 
    一 . 真 正 删 除 记 录
    ---- 在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;
    ---- 其 中,hDb 为 数 据 库TDatabse 的 句 柄,hCursor 为 数 据 表TTable 的 句 柄,pszTableName 为 要 删 除 记 录 的 数 据 表 的 名 称,pszDriverType 为 要 删 除 记 录 的 数 据 表 的 类 型,bRegenIdxs 表 示 是 否 在 删 除 记 录 后 自 动 更 新 索 引 文 件 . 
    ---- 在 上 面 前 四 个 参 数 中,hDb 不 能 为NULL .hCursor、pszTableName、pszDriverType 可 以 为 NULL, 但 必 须 提 供 足 够 的 信 息 来 标 识 数 据 表 的 文 件 名 称 和 类 型, 当hCursor 不 为 空 时, pszTableName 和pszDriverType 可 以 为NULL; 当pszTableName 为 数 据 表 的 路 径 和 文 件 名 时,hCursor 和pszDriverType 可 以 为NULL . 
    ---- 值 得 注 意 的 是, 在 删 除 记 录 时, 如 果 用Table 来 实 现, 则Table 必 须 以Exclusive=True 的 方 式 打 开 . 下 面 就 是 一 个 典 型 的 例 子 . 
    首先,应在uses语句加上DbiTypes,DbiProcs,DbiErrs.
    { Pack一个DBF数据表,DbfTable包含了数据表的信息 }
    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;
    二 . 显 示 或 不 显 示 被 软 删 除 记 录
    ---- 当DBF 数 据 库 中 的 记 录 被 软 删 除 后, 缺 省 情 况 下 在TDBGrid 等 数 据 库 构 件 中 是 看 不 见 这 些 记 录 的 . 我 们 可 以 用BDE 函 数 来 控 制 是 否 显 示DBF 数 据 库 中 被 软 删 除 的 记 录, 就 象 在Foxpro 中 利 用 语 句 Set Delete ON/OFF 那 样 . 
    ----     要 用 到 的 函 数 名 为DbiSetProp, 函 数 原 型 为 
    function DbiSetProp ( hObj : hDBIObj; iProp 
    : Longint; iPropValue : Longint): DBIResult;
    ---- 该 函 数 用 来 设 置DBI 对 象 中 某 个 属 性 的 值. 其 中,hObj 为DBI 对 象 名 称, 我 们 这 里 为 数 据 表TTable 的 句 柄;iProp 为 属 性 名 称, 我 们 用 的 是 软 删 除 属 性curSOFTDELETEON;iPropValue 为 属 性 值, 我 们 用True 或False 表 示 是 否 使 软 删 
    除 的 记 录 被 显 示 . 
    ----     下 面 就 是 一 个 典 型 的 例 子 . 
    ----     同 样, 应 在uses 语 句 加 上DbiTypes,DbiProcs,DbiErrs. 
    {显示DBF数据表中的软删除记录,
    DbfTable包含了数据表的信息,DeleteOn 
    表示是否显示,True表示显示 }
    function SetDbfDelete( DbfTable : 
    TTable ; DeleteOn : boolean ) : boolean;
    var
    errResult : DBIResult;
    begin
    result := false; {操作失败时,返回False }{如果数据表没有打开,则操作失败 }
    if ( not DbfTable.active ) then exit;{进行设置显示操作 }
    errResult := DbiSetProp( hDBIObj(DbfTable.Handle), 
    curSOFTDELETEON,
    LongInt( DeleteOn ));
    if errResult = DBIERR_NONE then
    {没有错误,则操作成功 }
    begin
    result := true;
    DbfTable.refresh;
    end;
    end;
    三 . 获 取 当 前 记 录 号
    ---- 在 用Foxpro 时,RecNo() 函 数 用 惯 了, 在Delphi 程 序 没 有 这 样 的 函 数 觉 得 别 扭 . 下 面 我 们 可 以 用BDE 函 数 获 取 当 前 记 录 在 数 据 集 中 的 记 录 号 . ---- 要 用 到 的 函 数 名 为DbiGetRecord, 函 数 原 型 为 
    function DbiGetRecord (hCursor : hDBICur; 
    eLock : DBILockType; pRecBuff : Pointer;
    precProps : pRECProps ): DBIResult;
    ---- 该 函 数 用 来 取 得 当 前 记 录 的 一 些 属 性 . 其 中,hCursor 可 为 数 据 集 的Handle,eLock 为 对 记 录 加 锁 的 类 型,pRecBuff 存 放 记 录 的 缓 冲 区, precProps 为 记 录 属 性 集 . 
    ----     下 面 就 是 一 个 典 型 的 例 子 .   
    同样,应在uses语句加上 DbiTypes,DbiProcs,DbiErrs. {取得当前记录的记录号 } 
    function RecNo( ADbfTable : TTable ) : LongInt;var RecordProps: RecProps; 
    begin Result := 0; {返回0表示函数执行失败 } with ADbfTable do begin {如果数据集处于非活
    动状态,则执行失败 } if not active then exit; {使数据集的当前记录与实际 的当前记录的位置
    一致 } UpdateCursorPos; {取得当前记录的属性, 主要是记录的位置 } 
    if DBIERR_NONE < > DbiGetRecord (Handle, dbiNOLOCK, nil, @RecordProps) then exit;
    {发生错误,则操作失败 } Result := RecordProps.iPhyRecNum; {取得记录号 } end; end; 
    四 . 设 置 查 询 匹 配 方 式( 精 确 匹 配/ 非 精 确 匹 配)
    ---- 在 用Foxpro 时,Set Exact ON/OFF 对 数 据 查 询 影 响 很 大 . 在Delphi 中, 我 们 
    同 样 可 以 进 行 这 样 的 设 置 . 
    ----     要 用 到 的 函 数 名 为DbiSetProp, 这 次 用 的 属 性 名 称iProp 为curINEXACTON, 
    属 性 值iPropValue 为 True 或False,True 表 示Set Exact OFF . 
    ----     下 面 就 是 一 个 典 型 的 例 子 . 
    同样,应在uses语句加上DbiTypes,DbiProcs,DbiErrs.{设置匹配方式,DbfTable 
    包含了数据表的信息,ExactOn 
    表示是否精确匹配,True表示是 }
    function SetDbfExact( DbfTable : 
    TTable ; ExactOn : boolean ) : boolean;
    var
    errResult : DBIResult;
    begin
    {如果没有打开,则操作失败 }
    if ( not DbfTable.active ) then
    begin
    result := false;
    exit;
    end;{进行设置显示操作 }
    errResult := DbiSetProp( hDBIObj(DbfTable.Handle),
    curINEXACTON,
    LongInt( not ExactOn ));if errResult = DBIERR_NONE then
    {没有错误,操作成功 }
    result := true
    else{发生错误,操作失败 }
    result := false;
    end;
    五 . 恢 复 被 软 删 除 的 记 录
    ---- 在Delphi 应 用 程 序 中, 对DBF 数 据 表 执 行 的 删 除 操 作 为 软 删 除 操 作 . 由 于 物 理 记 录 并 没 有 从 数 据 表 中 删 除, 我 们 就 可 以 恢 复 被 软 删 除 的 记 录, 只 要 去 掉 删 除 标 志 即 可 . 
    ----     要 用 到 的 函 数 名 为DbiUndeleteRecord, 函 数 原 型 为: 
    function DbiUndeleteRecord 
    ( hCursor : hDBICur ): DBIResult;
    ---- 其 中,hCursor 可 为 数 据 集 的Handle . 
    ----     下 面 就 是 一 个 典 型 的 例 子 . 
      同样,应在uses语句加上DbiTypes,DbiProcs,DbiErrs.{恢复被软删除的记录 }
    function UndeleteRecord
    ( DbfTable : TTable ) : boolean;
    begin
    Result := false;
    {返回false表示函数执行失败 }with DbfTable do
    begin
    {如果数据集处于非
    活动状态,则执行失败 }
    if not active then exit;{使数据集的当前记录与
    实际的当前记录的位置一致 }
    UpdateCursorPos;{恢复被软删除的记录 }
    if DBIERR_NONE < > DbiUndeleteRecord( Handle ) then
    exit;{发生错误,操作失败 }result := true; {操作成功 }
    end;
    end;
    ---- 上 面 是Delphi 操 作DBF 数 据 表 的 几 个 常 见 例 子, 希 望Delphi 会 给Delphi 程 序 员 带 来 越 来 越 多 的 方 便, 不 会 让Delphi 程 序 员 感 到 约 束 . 
    ---- 以 上 程 序 在PWin98+Delphi3.0 下 调 试 通 过 .