首页 | 社区 | 博客 | 招聘 | 文章 | 新闻 | 下载 | 读书 | 代码
亲,您未登录哦! 登录 | 注册

BDE函数对DBF数据库的的几个常用操作

打印文章

分享到:
在下面讨论中, 主要应用了BDE的函数.
Delphi 1.0 没有提供 BDE 函数的帮助文件, 请参见
DelphiDoc 中的 DbiTypes.int、 DbiProcs.int 和
DbiErrs.int 三个文件; 在Delphi 3.0/4.0 中可参
见 BDE 帮助文件. 本文讨论的 DBF 数据库操作主要
有: 真正删除记录、显示被删 除记录、 获取当前记
录号、 设置查询匹配方式、 恢复被删除记录.

一.真正删除记录

    在 Delphi 程序中, 用 TTable 或 TQuery 构件
的方法 Delete 执行删除记录的操作时, 执行的是软
删除, 即相当于 Foxpro 中的 "SetDeleteOff" 的效
果, 仅 将记录用星号 "*" 标记为删除, 实际并没有
数据 库中进行物理上的删除. 要进行真正的删除,
需要进行 PackTable 的操作.

    在 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;
varerrResult: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
DeleteON/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, 函数原型为

functionDbi GetRecord(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 时, SetExactON/OFF 对数据查询影响
很大. 在 Delphi 中, 我们同样可以进行这样的设置.

    要用到的函数名为 DbiSetProp, 这次用的属性名
称 iProp 为 curINEXACTON, 属性值 iPropValue 为 True
或 False,True 表示 SetExactOFF.

    下面就是一个典型的例子. 同样, 应在 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(notExactOn));

    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下调试通过.

本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )

编程爱好者论坛

本栏最新文章