由于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 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器