日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

delphi query 存储为dbf_在Delphi程序中维护DBF数据库

發(fā)布時間:2024/4/13 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 delphi query 存储为dbf_在Delphi程序中维护DBF数据库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

下載本文示例代碼

p>

由于Delphi開發(fā)的易用性和快速 性,很多原來使用Foxpro和VisualFoxpro編程的程序員轉(zhuǎn)向了Delphi.但由于工作上或其它的原因,原來的應用系統(tǒng)尤其是應用數(shù)據(jù),不可能被 一下丟棄,因而需要用Delphi來維護xBase數(shù)據(jù)庫的應用系統(tǒng).本文總結了在工作和學習中的經(jīng)驗,與廣大Delphi程序員和愛好者共享.

在下面討論中,主要應用了BDE的 函數(shù).Delphi1.0沒有提供BDE函數(shù)的幫助文件,請參見Delphi\Doc中的DbiTypes.int、DbiProcs.int和DbiErrs.int三個文件;在Delphi3.0/4.0中可參見BDE幫助文件.本文 討論的DBF數(shù)據(jù)庫操作主要有:真正刪除記錄、顯示被刪除記錄、獲取當前記錄號、設置查詢匹配方式、恢復被刪除記錄.

一.真正刪除記錄

在Delphi程序中,用TTable 或TQuery構件的方法Delete執(zhí)行刪除記錄的操作時執(zhí)行的是軟刪除,即相當于Foxpro中的SetDeleteOff的效果,僅將記錄用星號*標記為刪除, 實際并沒有數(shù)據(jù)庫中進行物理上的刪除.要進行真正的刪除,需要進行Pack Table的操作.

在Delphi程序中真正刪除記錄, 需要調(diào)用BDE函數(shù),函數(shù)名為DbiPackTable,函數(shù)原型為:

functionDbiPackTable(hDb:hDBIDb;hCursor :hDBICur;pszTableName:PChar;pszDriverType:PChar;bRegenIdxs

:Bool):DBIResult;

其中:hDb為數(shù)據(jù)庫TDatabse的句柄,

hCursor為數(shù)據(jù)表TTable的句柄,

pszTableName為要刪除記錄的數(shù)據(jù)表的名稱,

pszDriverType為要刪除記錄的數(shù)據(jù)表的類型,

bRegenIdxs表示是否在刪除記錄后自動更新索引文件.

在上面前四個參數(shù)中,hDb不能為NULL .hCursor、pszTableName、pszDriverType可以為NULL,但必須提供足夠的信息來標識數(shù)據(jù)表的文件名稱和類型,當hCursor不為空時,pszTableName 和pszDriverType可以為NULL;當pszTableName為數(shù)據(jù)表的路徑和文件名時,hCursor和pszDriverType可以為NULL.

值得注意的是,在刪除記錄時,如 果用Table來實現(xiàn),則Table必須以Exclusive=True的方式打開.下面就是一個典型的例子.

首先,應在uses語句加上:

DbiTypes,DbiProcs,DbiErrs.{Pack一個DBF數(shù)據(jù)表,DbfTable包含了數(shù)據(jù)表的信息

}

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);

{根據(jù)返回結果,返回成功與否的標志}

iferrResult=DBIERR_NONEthen {沒有錯誤,操作成功}

result:=true

else{沒有錯誤,操作失敗}

result:=false;

end;

二.顯示或不顯示被軟刪除記錄

當DBF數(shù)據(jù)庫中 的記錄被軟刪除后,缺省情況下在TDBGrid等數(shù)據(jù)庫構件中是看不見這些 記錄的.我們可以用BDE函數(shù)來控制是否顯示DBF數(shù)據(jù)庫中被軟刪除的記錄,就象在Foxpro中利用語句SetDeleteON/OFF那樣.

要用到的函數(shù)名為DbiSetProp,函數(shù)原型為:

functionDbiSetProp(hObj :hDBIObj;iProp:Longint;iPropValue:Longint):DBIResult;

該函數(shù)用來設置DBI對象中某個 屬性的值.

其中:hObj為DBI對象名稱,我 們這里為數(shù)據(jù)表TTable的句柄;

iProp為屬性名稱,我們用的是軟刪除屬性curSOFTDELETEON;

iPropValue為屬性值,我們用True或False表示是否使軟刪除的記錄被顯示.

下面就是一個典型的例子.同樣,應在uses語句加上

DbiTypes,DbiProcs,DbiErrs.

{顯示DBF數(shù)據(jù)表中的軟刪除記錄,DbfTable包含了數(shù)據(jù)表的信息,DeleteOn表示是否顯示,True表示顯示}

functionSetDbfDelete(DbfTable:TTable;DeleteOn:boolean ):boolean;

var

errResult:DBIResult;

begin

result:=false;{操作失敗時,返回False}

{如果數(shù)據(jù)表沒有打開,則操作失敗}

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()函數(shù)用慣了,在Delphi程序沒有這樣的函數(shù)覺得別扭.下面我 們可以用BDE函數(shù)獲取當前記錄在數(shù)據(jù)集中的記錄號.

要用到的函數(shù)名為DbiGetRecord,函數(shù)原型為:

functionDbiGetRecord(hCursor :hDBICur;eLock:DBILockType;pRecBuff:Pointer;precProps:

pRECProps):DBIResult;

該函數(shù)用來取得當前記錄的一些屬性.

其中:hCursor可為數(shù)據(jù)集的Handle,

eLock為對記錄加鎖的類型,

pRecBuff存放記錄的緩沖區(qū),

precProps為記錄屬性集.

下面就是一個典型的例子.同樣,應在uses語句加上:

DbiTypes,DbiProcs,DbiErrs.

{取得當前記錄的記錄號}

functionRecNo(ADbfTable:TTable):LongInt;

var

RecordProps:RecProps;

begin

Result:=0;{返回0表示函數(shù)執(zhí)行失敗}

withADbfTabledo

begin{如果數(shù)據(jù)集處于非活動狀態(tài),則執(zhí)行失敗}

ifnot activethen

exit;

{使數(shù)據(jù)集的當前記錄與實際的當前記錄的位置一致 }

UpdateCursorPos;

{取得當前記錄的屬性,主要是記錄的位置}

ifDBIERR_NONE$#@60; DbiGetRecord(Handle,dbiNOLOCK,nil,@RecordProps)then

exit;{發(fā)生錯誤,則操作失敗}

Result:=RecordProps.iPhyRecNum; {取得記錄號}

end;

end;

四.設置查詢匹配方式(精確匹配/非精確匹配)

在用Foxpro時,Set ExactON/OFF對數(shù)據(jù)查詢影響很大.在Delphi中,我們同樣可以進行這樣的設置.要用到的函數(shù)名為DbiSetProp,這次用的屬性名稱iProp為curINEXACTON, 屬性值iPropValue為True或False,True表示SetExactOFF.

下面就是一個典型的例子.

同樣,應在uses語句加上:

DbiTypes,DbiProcs,DbiErrs.

{設置匹配方式,DbfTable包含了數(shù)據(jù)表的信息,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{發(fā)生錯誤,操作失敗}

result:=false;

end;

五.恢復被軟刪除的記錄

在Delphi應用程序中,對DBF數(shù)據(jù)表執(zhí)行的刪除操作為軟刪除操作.由于物理記錄并沒 有從數(shù)據(jù)表中刪除,我們就可以恢復被軟刪除的記錄,只要去掉刪除標志即可.

要用到的函數(shù)名為DbiUndeleteRecord,函數(shù)原型為:

functionDbiUndeleteRecord (hCursor:hDBICur):DBIResult;

其中,hCursor可為數(shù)據(jù)集的Handle .

下面就是一個典型的例子.

同樣,應在uses語句加上:

DbiTypes,DbiProcs,DbiErrs.

{恢復被軟刪除的記錄}

functionUndeleteRecord(DbfTable:TTable):boolean;

begin

Result:=false;

{返回false表示函數(shù)執(zhí)行失敗}

withDbfTabledo

begin

{如果數(shù)據(jù)集處于非活動狀態(tài),則執(zhí)行失敗}

ifnotactivethen

exit;

{使數(shù)據(jù)集的當前記錄與實際的當前記錄的位置一致}

UpdateCursorPos;

{恢復被軟刪除的記錄}

ifDBIERR_NONEDbiUndeleteRecord(Handle)then

exit;{發(fā)生錯誤,操作失敗}

result:=true; {操作成功}

end;

end;

上面是Delphi操作DBF數(shù)據(jù)表的幾個常見例子,希望Delphi會給Delphi程序員帶來越來越多的方便,不會讓Delphi程序員感到約束.

p>

由于Delphi開發(fā)的易用性和快速 性,很多原來使用Foxpro和VisualFoxpro編程的程序員轉(zhuǎn)向了Delphi.但由于工作上或其它的原因,原來的應用系統(tǒng)尤其是應用數(shù)據(jù),不可能被 一下丟棄,因而需要用Delphi來維護xBase數(shù)據(jù)庫的應用系統(tǒng).本文總結了在工作和學習中的經(jīng)驗,與廣大Delphi程序員和愛好者共享.

在下面討論中,主要應用了BDE的 函數(shù).Delphi1.0沒有提供BDE函數(shù)的幫助文件,請參見Delphi\Doc中的DbiTypes.int、DbiProcs.int和DbiErrs.int三個文件;在Delphi3.0/4.0中可參見BDE幫助文件.本文 討論的DBF數(shù)據(jù)庫操作主要有:真正刪除記錄、顯示被刪除記錄、獲取當前記錄號、設置查詢匹配方式、恢復被刪除記錄.

一.真正刪除記錄

在Delphi程序中,用TTable 或TQuery構件的方法Delete執(zhí)行刪除記錄的操作時執(zhí)行的是軟刪除,即相當于Foxpro中的SetDeleteOff的效果,僅將記錄用星號*標記為刪除, 實際并沒有數(shù)據(jù)庫中進行物理上的刪除.要進行真正的刪除,需要進行Pack Table的操作.

在Delphi程序中真正刪除記錄, 需要調(diào)用BDE函數(shù),函數(shù)名為DbiPackTable,函數(shù)原型為:

functionDbiPackTable(hDb:hDBIDb;hCursor :hDBICur;pszTableName:PChar;pszDriverType:PChar;bRegenIdxs

:Bool):DBIResult;

其中:hDb為數(shù)據(jù)庫TDatabse的句柄,

hCursor為數(shù)據(jù)表TTable的句柄,

pszTableName為要刪除記錄的數(shù)據(jù)表的名稱,

pszDriverType為要刪除記錄的數(shù)據(jù)表的類型,

bRegenIdxs表示是否在刪除記錄后自動更新索引文件.

在上面前四個參數(shù)中,hDb不能為NULL .hCursor、pszTableName、pszDriverType可以為NULL,但必須提供足夠的信息來標識數(shù)據(jù)表的文件名稱和類型,當hCursor不為空時,pszTableName 和pszDriverType可以為NULL;當pszTableName為數(shù)據(jù)表的路徑和文件名時,hCursor和pszDriverType可以為NULL.

值得注意的是,在刪除記錄時,如 果用Table來實現(xiàn),則Table必須以Exclusive=True的方式打開.下面就是一個典型的例子.

首先,應在uses語句加上:

DbiTypes,DbiProcs,DbiErrs.{Pack一個DBF數(shù)據(jù)表,DbfTable包含了數(shù)據(jù)表的信息

}

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);

{根據(jù)返回結果,返回成功與否的標志}

iferrResult=DBIERR_NONEthen {沒有錯誤,操作成功}

result:=true

else{沒有錯誤,操作失敗}

result:=false;

end;

二.顯示或不顯示被軟刪除記錄

當DBF數(shù)據(jù)庫中 的記錄被軟刪除后,缺省情況下在TDBGrid等數(shù)據(jù)庫構件中是看不見這些 記錄的.我們可以用BDE函數(shù)來控制是否顯示DBF數(shù)據(jù)庫中被軟刪除的記錄,就象在Foxpro中利用語句SetDeleteON/OFF那樣.

要用到的函數(shù)名為DbiSetProp,函數(shù)原型為:

functionDbiSetProp(hObj :hDBIObj;iProp:Longint;iPropValue:Longint):DBIResult;

該函數(shù)用來設置DBI對象中某個 屬性的值.

其中:hObj為DBI對象名稱,我 們這里為數(shù)據(jù)表TTable的句柄;

iProp為屬性名稱,我們用的是軟刪除屬性curSOFTDELETEON;

iPropValue為屬性值,我們用True或False表示是否使軟刪除的記錄被顯示.

下面就是一個典型的例子.同樣,應在uses語句加上

DbiTypes,DbiProcs,DbiErrs.

{顯示DBF數(shù)據(jù)表中的軟刪除記錄,DbfTable包含了數(shù)據(jù)表的信息,DeleteOn表示是否顯示,True表示顯示}

functionSetDbfDelete(DbfTable:TTable;DeleteOn:boolean ):boolean;

var

errResult:DBIResult;

begin

result:=false;{操作失敗時,返回False}

{如果數(shù)據(jù)表沒有打開,則操作失敗}

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()函數(shù)用慣了,在Delphi程序沒有這樣的函數(shù)覺得別扭.下面我 們可以用BDE函數(shù)獲取當前記錄在數(shù)據(jù)集中的記錄號.

要用到的函數(shù)名為DbiGetRecord,函數(shù)原型為:

functionDbiGetRecord(hCursor :hDBICur;eLock:DBILockType;pRecBuff:Pointer;precProps:

pRECProps):DBIResult;

該函數(shù)用來取得當前記錄的一些屬性.

其中:hCursor可為數(shù)據(jù)集的Handle,

eLock為對記錄加鎖的類型,

pRecBuff存放記錄的緩沖區(qū),

precProps為記錄屬性集.

下面就是一個典型的例子.同樣,應在uses語句加上:

DbiTypes,DbiProcs,DbiErrs.

{取得當前記錄的記錄號}

functionRecNo(ADbfTable:TTable):LongInt;

var

RecordProps:RecProps;

begin

Result:=0;{返回0表示函數(shù)執(zhí)行失敗}

withADbfTabledo

begin{如果數(shù)據(jù)集處于非活動狀態(tài),則執(zhí)行失敗}

ifnot activethen

exit;

{使數(shù)據(jù)集的當前記錄與實際的當前記錄的位置一致 }

UpdateCursorPos;

{取得當前記錄的屬性,主要是記錄的位置}

ifDBIERR_NONE$#@60; DbiGetRecord(Handle,dbiNOLOCK,nil,@RecordProps)then

exit;{發(fā)生錯誤,則操作失敗}

Result:=RecordProps.iPhyRecNum; {取得記錄號}

end;

end;

四.設置查詢匹配方式(精確匹配/非精確匹配)

在用Foxpro時,Set ExactON/OFF對數(shù)據(jù)查詢影響很大.在Delphi中,我們同樣可以進行這樣的設置.要用到的函數(shù)名為DbiSetProp,這次用的屬性名稱iProp為curINEXACTON, 屬性值iPropValue為True或False,True表示SetExactOFF.

下面就是一個典型的例子.

同樣,應在uses語句加上:

DbiTypes,DbiProcs,DbiErrs.

{設置匹配方式,DbfTable包含了數(shù)據(jù)表的信息,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{發(fā)生錯誤,操作失敗}

result:=false;

end;

五.恢復被軟刪除的記錄

在Delphi應用程序中,對DBF數(shù)據(jù)表執(zhí)行的刪除操作為軟刪除操作.由于物理記錄并沒 有從數(shù)據(jù)表中刪除,我們就可以恢復被軟刪除的記錄,只要去掉刪除標志即可.

要用到的函數(shù)名為DbiUndeleteRecord,函數(shù)原型為:

functionDbiUndeleteRecord (hCursor:hDBICur):DBIResult;

其中,hCursor可為數(shù)據(jù)集的Handle .

下面就是一個典型的例子.

同樣,應在uses語句加上:

DbiTypes,DbiProcs,DbiErrs.

{恢復被軟刪除的記錄}

functionUndeleteRecord(DbfTable:TTable):boolean;

begin

Result:=false;

{返回false表示函數(shù)執(zhí)行失敗}

withDbfTabledo

begin

{如果數(shù)據(jù)集處于非活動狀態(tài),則執(zhí)行失敗}

ifnotactivethen

exit;

{使數(shù)據(jù)集的當前記錄與實際的當前記錄的位置一致}

UpdateCursorPos;

{恢復被軟刪除的記錄}

ifDBIERR_NONEDbiUndeleteRecord(Handle)then

exit;{發(fā)生錯誤,操作失敗}

result:=true; {操作成功}

end;

end;

上面是Delphi操作DBF數(shù)據(jù)表的幾個常見例子,希望Delphi會給Delphi程序員帶來越來越多的方便,不會讓Delphi程序員感到約束.

下載本文示例代碼

在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫在Delphi程序中維護DBF數(shù)據(jù)庫

閱讀(38) | 評論(0) | 轉(zhuǎn)發(fā)(0) |

總結

以上是生活随笔為你收集整理的delphi query 存储为dbf_在Delphi程序中维护DBF数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。