在Delphi程序中维护DBF数据库
2008-04-09 04:17:20来源:互联网 阅读 ()
由于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;
{取得当前记录的属性,主要是记录的位置}标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash