选择显示字体大小

在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_n.nethen {没有错误,操作成功}
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_n.nethen{没有错误,则操作成功 }
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_n.nethen {没有错误,操作成功}
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程序员感到约束.


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons