学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> Delphi >> 在Delphi程序中维护DBF数据库


在Delphi程序中维护DBF数据库


  由于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程序员感到约束.

技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"在Delphi程序中维护DBF数据库"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 在Delphi程序中维护DBF数据库 相关内容
Google搜索中 在Delphi程序中维护DBF数据库 相关内容
雅虎中 在Delphi程序中维护DBF数据库 相关内容
Sogou搜索中 在Delphi程序中维护DBF数据库 相关内容

相关软件 最新回复帖子:

·Windows Vista 中卸载软件的不同方式
·没有mysql支持时的替代方案
·一个可以发送附件及HTML格式邮件的PHP类
·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描
·巧用Photoshop画笔轻松绘制创意特效


  相关软件 在Delphi程序中维护DBF数据库相关文章
用Delphi 开发数据库程序经验三则 在Delphi的DBGrid中插入其他可视组件
Delphi3数据库编程中的查找字段 Delphi数据库开发及统计表格设计
用Delphi4的QReport部件生成报表 也谈为Delphi中数据库报表加网格
在Dephi中使用TStream读写数据的技巧 Delphi中的消息处理
在DEPHI程序中使用ADO对象存取ODBC数续 在DELPHI程序中使用ADO对象存取ODBC数
在DELPHI程序中动态设置ODBC数据源 精简DELPHI数据库系统的补充
如何对数据流 INSERT、APPEND 定制任务栏上的系统菜单
活用 SetSelTextBuf 捕捉来自 Thread 的异常
在DEPHI 4.0中实现动画功能 修改与克隆对象属性
控制系统菜单 怎样建立简单的任务栏应用程序