Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16495223
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:46:42

下载本文示例代码
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数据库
阅读(155) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~