下载本文示例代码

p>

由于Delphi开发的易用性和快速 性,很多原来使用Foxpro和VisualFoxpro编程的程序员转向了Delphi.但由于工作上或其它的原因,原来的应用系统尤其是应用数据,不可能被 一下丢弃,因而需要用Delphi来维护xBase数据库的应用系统.本文总结了在工作和学习中的经验,与广大Delphi程序员和爱好者共享.

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

一.真正删除记录

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

在Delphi程序中真正删除记录, 需要调用BDE函数,函数名为DbiPackTable,函数原型为:

functionDbiPackTable(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包含了数据表的信息

}

functionPackDbf le(DbfTable:TTable):boolean;

var

errResult:DBIResult;

begin

ifnotDbfTable.Exclusivethen {如果不是以独占方式,操作失败}

begin

result:=false;

exit;

end;

{进行删除操作}

errResult:=DbiPackTable(DbfTable.dbHandle, DbfTable.handle,NIL,NIL,true);

{根据返回结果,返回成功与否的标志}

iferrResult=DBIERR_NONEthen {没有错误,操作成功}

result:=true

else{没有错误,操作失败}

result:=false;

end;

二.显示或不显示被软删除记录

当DBF数据库中 的记录被软删除后,缺省情况下在TDBGrid等数据库构件中是看不见这些 记录的.我们可以用BDE函数来控制是否显示DBF数据库中被软删除的记录,就象在Foxpro中利用语句SetDeleteON/OFF那样.

要用到的函数名为DbiSetProp,函数原型为:

functionDbiSetProp(hObj :hDBIObj;iProp:Longint;iPropValue:Longint):DBIResult;

该函数用来设置DBI对象中某个 属性的值.

其中:hObj为DBI对象名称,我 们这里为数据表TTable的句柄;

iProp为属性名称,我们用的是软删除属性curSOFTDELETEON;

iPropValue为属性值,我们用True或False表示是否使软删除的记录被显示.

下面就是一个典型的例子.同样,应在uses语句加上

DbiTypes,DbiProcs,DbiErrs.

{显示DBF数据表中的软删除记录,DbfTable包含了数据表的信息,DeleteOn表示是否显示,True表示显示}

functionSetDbfDelete(DbfTable:TTable;DeleteOn:boolean ):boolean;

var

errResult:DBIResult;

begin

result:=false;{操作失败时,返回False}

{如果数据表没有打开,则操作失败}

if(notDbfTable.active)then

exit;

{进行设置显示操作}

errResult:=DbiSetProp(hDBIObj(DbfTable.Handle), curSOFTDELETEON,LongInt(DeleteOn));

iferrResult=DBIERR_NONEthen{没有错误,则操作成功 }

begin

result:=true;

DbfTable.refresh;

end;

end;

三.获取当前记录号

在用Foxpro 时,RecNo()函数用惯了,在Delphi程序没有这样的函数觉得别扭.下面我 们可以用BDE函数获取当前记录在数据集中的记录号.

要用到的函数名为DbiGetRecord,函数原型为:

functionDbiGetRecord(hCursor :hDBICur;eLock:DBILockType;pRecBuff:Pointer;precProps:

pRECProps):DBIResult;

该函数用来取得当前记录的一些属性.

其中:hCursor可为数据集的Handle,

eLock为对记录加锁的类型,

pRecBuff存放记录的缓冲区,

precProps为记录属性集.

下面就是一个典型的例子.同样,应在uses语句加上:

DbiTypes,DbiProcs,DbiErrs.

{取得当前记录的记录号}

functionRecNo(ADbfTable:TTable):LongInt;

var

RecordProps:RecProps;

begin

Result:=0;{返回0表示函数执行失败}

withADbfTabledo

begin{如果数据集处于非活动状态,则执行失败}

ifnot activethen

exit;

{使数据集的当前记录与实际的当前记录的位置一致 }

UpdateCursorPos;

{取得当前记录的属性,主要是记录的位置}

ifDBIERR_NONE$#@60; DbiGetRecord(Handle,dbiNOLOCK,nil,@RecordProps)then

exit;{发生错误,则操作失败}

Result:=RecordProps.iPhyRecNum; {取得记录号}

end;

end;

四.设置查询匹配方式(精确匹配/非精确匹配)

在用Foxpro时,Set ExactON/OFF对数据查询影响很大.在Delphi中,我们同样可以进行这样的设置.要用到的函数名为DbiSetProp,这次用的属性名称iProp为curINEXACTON, 属性值iPropValue为True或False,True表示SetExactOFF.

下面就是一个典型的例子.

同样,应在uses语句加上:

DbiTypes,DbiProcs,DbiErrs.

{设置匹配方式,DbfTable包含了数据表的信息,ExactOn表示是否精确匹配,True表示是}

functionSetDbfExact(DbfTable:TTable;ExactOn:boolean) :boolean;

var

errResult:DBIResult;

begin

{如果没有打开,则操作失败}

if(notDbfTable.active)then

begin

result:=false;

exit;

end;

{进行设置显示操作}

errResult:=DbiSetProp(hDBIObj(DbfTable.Handle), curINEXACTON,LongInt(notExactOn));

iferrResult=DBIERR_NONEthen {没有错误,操作成功}

result:=true

else{发生错误,操作失败}

result:=false;

end;

五.恢复被软删除的记录

在Delphi应用程序中,对DBF数据表执行的删除操作为软删除操作.由于物理记录并没 有从数据表中删除,我们就可以恢复被软删除的记录,只要去掉删除标志即可.

要用到的函数名为DbiUndeleteRecord,函数原型为:

functionDbiUndeleteRecord (hCursor:hDBICur):DBIResult;

其中,hCursor可为数据集的Handle .

下面就是一个典型的例子.

同样,应在uses语句加上:

DbiTypes,DbiProcs,DbiErrs.

{恢复被软删除的记录}

functionUndeleteRecord(DbfTable:TTable):boolean;

begin

Result:=false;

{返回false表示函数执行失败}

withDbfTabledo

begin

{如果数据集处于非活动状态,则执行失败}

ifnotactivethen

exit;

{使数据集的当前记录与实际的当前记录的位置一致}

UpdateCursorPos;

{恢复被软删除的记录}

ifDBIERR_NONEDbiUndeleteRecord(Handle)then

exit;{发生错误,操作失败}

result:=true; {操作成功}

end;

end;

上面是Delphi操作DBF数据表的几个常见例子,希望Delphi会给Delphi程序员带来越来越多的方便,不会让Delphi程序员感到约束.

p>

由于Delphi开发的易用性和快速 性,很多原来使用Foxpro和VisualFoxpro编程的程序员转向了Delphi.但由于工作上或其它的原因,原来的应用系统尤其是应用数据,不可能被 一下丢弃,因而需要用Delphi来维护xBase数据库的应用系统.本文总结了在工作和学习中的经验,与广大Delphi程序员和爱好者共享.

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

一.真正删除记录

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

在Delphi程序中真正删除记录, 需要调用BDE函数,函数名为DbiPackTable,函数原型为:

functionDbiPackTable(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包含了数据表的信息

}

functionPackDbf le(DbfTable:TTable):boolean;

var

errResult:DBIResult;

begin

ifnotDbfTable.Exclusivethen {如果不是以独占方式,操作失败}

begin

result:=false;

exit;

end;

{进行删除操作}

errResult:=DbiPackTable(DbfTable.dbHandle, DbfTable.handle,NIL,NIL,true);

{根据返回结果,返回成功与否的标志}

iferrResult=DBIERR_NONEthen {没有错误,操作成功}

result:=true

else{没有错误,操作失败}

result:=false;

end;

二.显示或不显示被软删除记录

当DBF数据库中 的记录被软删除后,缺省情况下在TDBGrid等数据库构件中是看不见这些 记录的.我们可以用BDE函数来控制是否显示DBF数据库中被软删除的记录,就象在Foxpro中利用语句SetDeleteON/OFF那样.

要用到的函数名为DbiSetProp,函数原型为:

functionDbiSetProp(hObj :hDBIObj;iProp:Longint;iPropValue:Longint):DBIResult;

该函数用来设置DBI对象中某个 属性的值.

其中:hObj为DBI对象名称,我 们这里为数据表TTable的句柄;

iProp为属性名称,我们用的是软删除属性curSOFTDELETEON;

iPropValue为属性值,我们用True或False表示是否使软删除的记录被显示.

下面就是一个典型的例子.同样,应在uses语句加上

DbiTypes,DbiProcs,DbiErrs.

{显示DBF数据表中的软删除记录,DbfTable包含了数据表的信息,DeleteOn表示是否显示,True表示显示}

functionSetDbfDelete(DbfTable:TTable;DeleteOn:boolean ):boolean;

var

errResult:DBIResult;

begin

result:=false;{操作失败时,返回False}

{如果数据表没有打开,则操作失败}

if(notDbfTable.active)then

exit;

{进行设置显示操作}

errResult:=DbiSetProp(hDBIObj(DbfTable.Handle), curSOFTDELETEON,LongInt(DeleteOn));

iferrResult=DBIERR_NONEthen{没有错误,则操作成功 }

begin

result:=true;

DbfTable.refresh;

end;

end;

三.获取当前记录号

在用Foxpro 时,RecNo()函数用惯了,在Delphi程序没有这样的函数觉得别扭.下面我 们可以用BDE函数获取当前记录在数据集中的记录号.

要用到的函数名为DbiGetRecord,函数原型为:

functionDbiGetRecord(hCursor :hDBICur;eLock:DBILockType;pRecBuff:Pointer;precProps:

pRECProps):DBIResult;

该函数用来取得当前记录的一些属性.

其中:hCursor可为数据集的Handle,

eLock为对记录加锁的类型,

pRecBuff存放记录的缓冲区,

precProps为记录属性集.

下面就是一个典型的例子.同样,应在uses语句加上:

DbiTypes,DbiProcs,DbiErrs.

{取得当前记录的记录号}

functionRecNo(ADbfTable:TTable):LongInt;

var

RecordProps:RecProps;

begin

Result:=0;{返回0表示函数执行失败}

withADbfTabledo

begin{如果数据集处于非活动状态,则执行失败}

ifnot activethen

exit;

{使数据集的当前记录与实际的当前记录的位置一致 }

UpdateCursorPos;

{取得当前记录的属性,主要是记录的位置}

ifDBIERR_NONE$#@60; DbiGetRecord(Handle,dbiNOLOCK,nil,@RecordProps)then

exit;{发生错误,则操作失败}

Result:=RecordProps.iPhyRecNum; {取得记录号}

end;

end;

四.设置查询匹配方式(精确匹配/非精确匹配)

在用Foxpro时,Set ExactON/OFF对数据查询影响很大.在Delphi中,我们同样可以进行这样的设置.要用到的函数名为DbiSetProp,这次用的属性名称iProp为curINEXACTON, 属性值iPropValue为True或False,True表示SetExactOFF.

下面就是一个典型的例子.

同样,应在uses语句加上:

DbiTypes,DbiProcs,DbiErrs.

{设置匹配方式,DbfTable包含了数据表的信息,ExactOn表示是否精确匹配,True表示是}

functionSetDbfExact(DbfTable:TTable;ExactOn:boolean) :boolean;

var

errResult:DBIResult;

begin

{如果没有打开,则操作失败}

if(notDbfTable.active)then

begin

result:=false;

exit;

end;

{进行设置显示操作}

errResult:=DbiSetProp(hDBIObj(DbfTable.Handle), curINEXACTON,LongInt(notExactOn));

iferrResult=DBIERR_NONEthen {没有错误,操作成功}

result:=true

else{发生错误,操作失败}

result:=false;

end;

五.恢复被软删除的记录

在Delphi应用程序中,对DBF数据表执行的删除操作为软删除操作.由于物理记录并没 有从数据表中删除,我们就可以恢复被软删除的记录,只要去掉删除标志即可.

要用到的函数名为DbiUndeleteRecord,函数原型为:

functionDbiUndeleteRecord (hCursor:hDBICur):DBIResult;

其中,hCursor可为数据集的Handle .

下面就是一个典型的例子.

同样,应在uses语句加上:

DbiTypes,DbiProcs,DbiErrs.

{恢复被软删除的记录}

functionUndeleteRecord(DbfTable:TTable):boolean;

begin

Result:=false;

{返回false表示函数执行失败}

withDbfTabledo

begin

{如果数据集处于非活动状态,则执行失败}

ifnotactivethen

exit;

{使数据集的当前记录与实际的当前记录的位置一致}

UpdateCursorPos;

{恢复被软删除的记录}

ifDBIERR_NONEDbiUndeleteRecord(Handle)then

exit;{发生错误,操作失败}

result:=true; {操作成功}

end;

end;

上面是Delphi操作DBF数据表的几个常见例子,希望Delphi会给Delphi程序员带来越来越多的方便,不会让Delphi程序员感到约束.

下载本文示例代码

在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库在Delphi程序中维护DBF数据库

阅读(38) | 评论(0) | 转发(0) |

delphi query 存储为dbf_在Delphi程序中维护DBF数据库相关推荐

  1. 在 Android 应用程序中使用 SQLite 数据库以及怎么用

    part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...

  2. mye连接mysql数据库_MySQL_如何在Java程序中访问mysql数据库中的数据并进行简单的操作,在上篇文章给大家介绍了Myeclip - phpStudy...

    如何在Java程序中访问mysql数据库中的数据并进行简单的操作 在上篇文章给大家介绍了Myeclipse连接mysql数据库的方法,通过本文给大家介绍如何在Java程序中访问mysql数据库中的数据 ...

  3. Java web程序中备份oracle数据库

    Java web程序中备份oracle数据库 1.生成备份文件: public ActionForward createDmp(ActionMapping mapping, ActionForm fo ...

  4. Java嵌入式数据库H2学习总结(二)——在Web应用程序中使用H2数据库

    一.搭建测试环境和项目 1.1.搭建JavaWeb测试项目 创建一个[H2DBTest]JavaWeb项目,找到H2数据库的jar文件,如下图所示: H2数据库就一个jar文件,这个Jar文件里面包含 ...

  5. 微信小程序中如何使用数据库_如何在程序中使用数据库

    微信小程序中如何使用数据库 如何在程序中使用数据库 许多.NET解决方案都是数据库驱动的,因此我们很多人常常想知道如何访问数据库. 为了帮助您理解该问题的答案,我提供了以下示例,作为如何从数据库检索数 ...

  6. mysql表打包到程序中_关于数据库程序的打包

    利用开发工具delphi设计一个数据库应用程序,利用ado(ActiveX Data Objects)进行设计的方案适合基于在本机上运行或利用SQL进行访问的C/S结构的应用方案.总之应用还是比较好, ...

  7. kotlin数据库_如何在Kotlin应用程序中使用Xodus数据库

    kotlin数据库 I want to show you how to use one of my favorite database choices for Kotlin applications. ...

  8. 在ASP程序中访问Access数据库

    嵌入式培训教程 在基于微软IIS/PWS的网络平台上,通过服务器端运行的ASP程序来访问后台数据库,是一种最常见的模式了.而对于小型的数据库应用需求,微软的Access数据库,应该是与ASP程序配套使 ...

  9. oledb vc访问mdb数据库_VC++程序中访问ACCESS 数据库使用用户名和密码

    此网站选择Access进入查看ADO 使用连接数据库的字符串,如使用到带用户名和密码连接Access数据库要用到以下条目: 红线标注的为使用连接数据库时设置的字符串,如果使用到用户Admin,密码Ad ...

最新文章

  1. 如何防止ISE综合时信号不被优化掉
  2. Python 进阶 — 面向对象编程
  3. 剖析数据库中重要而又常被曲解的概念
  4. 【项目介绍】FTP服务器
  5. 安装SCOM Reporting Server
  6. Torch 学习总结
  7. request.getRequestURL()和request.getRequestURI()区别
  8. Atitit jdk net golang sdk标准库对比 Atitit sdk封装的艺术 艾提拉著 1. 重要模块8个 1 1.1. Collections集合,core,net,io,
  9. STM32F103串口通信用于获取GY-53 红外测距模块数据
  10. [渝粤教育] 西北农林科技大学 土壤学 参考 资料
  11. 动态规划(Dynamic Programming)算法与LC实例的理解
  12. 怎样找回win7密钥
  13. java whois_Java实现简单whois查询
  14. FITC标记亲和纯化大鼠抗小鼠IgG(H+L)二抗说明书
  15. 零基础入门学Python(十二)—— 魔法方法(下)
  16. 如何成为一名合格的LINUX系统管理员
  17. 算法_二叉树_二叉树的最大深度
  18. Traceback (most recent call last)
  19. 元宇宙开发者指南【Metaverse】
  20. android无线充电器推荐,和安卓通用的无线充电器门派推荐

热门文章

  1. [BootStrap] 富编辑器,基于wysihtml5
  2. [Cocos2d-x For WP8]Menu菜单
  3. 转:HTTP请求(GET、POST和soap区别)和响应
  4. Access结合aspnetpager分页
  5. 为什么Node约定,回调函数的第一个参数必须是err(如果没有错误该参数就是null)?...
  6. zimbra邮件系统详细配置教程
  7. IIS 7.5 Express概况
  8. Html5实现手机九宫格密码解锁功能
  9. 记一次数据库宕机处理
  10. Python 办公自动化:让你的工作效率翻番