delphi query 存储为dbf_在Delphi程序中维护DBF数据库
下載本文示例代碼
p>
由于Delphi開發(fā)的易用性和快速 性,很多原來使用Foxpro和VisualFoxpro編程的程序員轉(zhuǎn)向了Delphi.但由于工作上或其它的原因,原來的應(yīng)用系統(tǒng)尤其是應(yīng)用數(shù)據(jù),不可能被 一下丟棄,因而需要用Delphi來維護(hù)xBase數(shù)據(jù)庫的應(yīng)用系統(tǒng).本文總結(jié)了在工作和學(xué)習(xí)中的經(jīng)驗(yàn),與廣大Delphi程序員和愛好者共享.
在下面討論中,主要應(yīng)用了BDE的 函數(shù).Delphi1.0沒有提供BDE函數(shù)的幫助文件,請參見Delphi\Doc中的DbiTypes.int、DbiProcs.int和DbiErrs.int三個(gè)文件;在Delphi3.0/4.0中可參見BDE幫助文件.本文 討論的DBF數(shù)據(jù)庫操作主要有:真正刪除記錄、顯示被刪除記錄、獲取當(dāng)前記錄號、設(shè)置查詢匹配方式、恢復(fù)被刪除記錄.
一.真正刪除記錄
在Delphi程序中,用TTable 或TQuery構(gòu)件的方法Delete執(zhí)行刪除記錄的操作時(shí)執(zhí)行的是軟刪除,即相當(dāng)于Foxpro中的SetDeleteOff的效果,僅將記錄用星號*標(biāo)記為刪除, 實(shí)際并沒有數(shù)據(jù)庫中進(jìn)行物理上的刪除.要進(jìn)行真正的刪除,需要進(jìn)行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為要?jiǎng)h除記錄的數(shù)據(jù)表的名稱,
pszDriverType為要?jiǎng)h除記錄的數(shù)據(jù)表的類型,
bRegenIdxs表示是否在刪除記錄后自動(dòng)更新索引文件.
在上面前四個(gè)參數(shù)中,hDb不能為NULL .hCursor、pszTableName、pszDriverType可以為NULL,但必須提供足夠的信息來標(biāo)識數(shù)據(jù)表的文件名稱和類型,當(dāng)hCursor不為空時(shí),pszTableName 和pszDriverType可以為NULL;當(dāng)pszTableName為數(shù)據(jù)表的路徑和文件名時(shí),hCursor和pszDriverType可以為NULL.
值得注意的是,在刪除記錄時(shí),如 果用Table來實(shí)現(xiàn),則Table必須以Exclusive=True的方式打開.下面就是一個(gè)典型的例子.
首先,應(yīng)在uses語句加上:
DbiTypes,DbiProcs,DbiErrs.{Pack一個(gè)DBF數(shù)據(jù)表,DbfTable包含了數(shù)據(jù)表的信息
}
functionPackDbf le(DbfTable:TTable):boolean;
var
errResult:DBIResult;
begin
ifnotDbfTable.Exclusivethen {如果不是以獨(dú)占方式,操作失敗}
begin
result:=false;
exit;
end;
{進(jìn)行刪除操作}
errResult:=DbiPackTable(DbfTable.dbHandle, DbfTable.handle,NIL,NIL,true);
{根據(jù)返回結(jié)果,返回成功與否的標(biāo)志}
iferrResult=DBIERR_NONEthen {沒有錯(cuò)誤,操作成功}
result:=true
else{沒有錯(cuò)誤,操作失敗}
result:=false;
end;
二.顯示或不顯示被軟刪除記錄
當(dāng)DBF數(shù)據(jù)庫中 的記錄被軟刪除后,缺省情況下在TDBGrid等數(shù)據(jù)庫構(gòu)件中是看不見這些 記錄的.我們可以用BDE函數(shù)來控制是否顯示DBF數(shù)據(jù)庫中被軟刪除的記錄,就象在Foxpro中利用語句SetDeleteON/OFF那樣.
要用到的函數(shù)名為DbiSetProp,函數(shù)原型為:
functionDbiSetProp(hObj :hDBIObj;iProp:Longint;iPropValue:Longint):DBIResult;
該函數(shù)用來設(shè)置DBI對象中某個(gè) 屬性的值.
其中:hObj為DBI對象名稱,我 們這里為數(shù)據(jù)表TTable的句柄;
iProp為屬性名稱,我們用的是軟刪除屬性curSOFTDELETEON;
iPropValue為屬性值,我們用True或False表示是否使軟刪除的記錄被顯示.
下面就是一個(gè)典型的例子.同樣,應(yīng)在uses語句加上
DbiTypes,DbiProcs,DbiErrs.
{顯示DBF數(shù)據(jù)表中的軟刪除記錄,DbfTable包含了數(shù)據(jù)表的信息,DeleteOn表示是否顯示,True表示顯示}
functionSetDbfDelete(DbfTable:TTable;DeleteOn:boolean ):boolean;
var
errResult:DBIResult;
begin
result:=false;{操作失敗時(shí),返回False}
{如果數(shù)據(jù)表沒有打開,則操作失敗}
if(notDbfTable.active)then
exit;
{進(jìn)行設(shè)置顯示操作}
errResult:=DbiSetProp(hDBIObj(DbfTable.Handle), curSOFTDELETEON,LongInt(DeleteOn));
iferrResult=DBIERR_NONEthen{沒有錯(cuò)誤,則操作成功 }
begin
result:=true;
DbfTable.refresh;
end;
end;
三.獲取當(dāng)前記錄號
在用Foxpro 時(shí),RecNo()函數(shù)用慣了,在Delphi程序沒有這樣的函數(shù)覺得別扭.下面我 們可以用BDE函數(shù)獲取當(dāng)前記錄在數(shù)據(jù)集中的記錄號.
要用到的函數(shù)名為DbiGetRecord,函數(shù)原型為:
functionDbiGetRecord(hCursor :hDBICur;eLock:DBILockType;pRecBuff:Pointer;precProps:
pRECProps):DBIResult;
該函數(shù)用來取得當(dāng)前記錄的一些屬性.
其中:hCursor可為數(shù)據(jù)集的Handle,
eLock為對記錄加鎖的類型,
pRecBuff存放記錄的緩沖區(qū),
precProps為記錄屬性集.
下面就是一個(gè)典型的例子.同樣,應(yīng)在uses語句加上:
DbiTypes,DbiProcs,DbiErrs.
{取得當(dāng)前記錄的記錄號}
functionRecNo(ADbfTable:TTable):LongInt;
var
RecordProps:RecProps;
begin
Result:=0;{返回0表示函數(shù)執(zhí)行失敗}
withADbfTabledo
begin{如果數(shù)據(jù)集處于非活動(dòng)狀態(tài),則執(zhí)行失敗}
ifnot activethen
exit;
{使數(shù)據(jù)集的當(dāng)前記錄與實(shí)際的當(dāng)前記錄的位置一致 }
UpdateCursorPos;
{取得當(dāng)前記錄的屬性,主要是記錄的位置}
ifDBIERR_NONE$#@60; DbiGetRecord(Handle,dbiNOLOCK,nil,@RecordProps)then
exit;{發(fā)生錯(cuò)誤,則操作失敗}
Result:=RecordProps.iPhyRecNum; {取得記錄號}
end;
end;
四.設(shè)置查詢匹配方式(精確匹配/非精確匹配)
在用Foxpro時(shí),Set ExactON/OFF對數(shù)據(jù)查詢影響很大.在Delphi中,我們同樣可以進(jìn)行這樣的設(shè)置.要用到的函數(shù)名為DbiSetProp,這次用的屬性名稱iProp為curINEXACTON, 屬性值iPropValue為True或False,True表示SetExactOFF.
下面就是一個(gè)典型的例子.
同樣,應(yīng)在uses語句加上:
DbiTypes,DbiProcs,DbiErrs.
{設(shè)置匹配方式,DbfTable包含了數(shù)據(jù)表的信息,ExactOn表示是否精確匹配,True表示是}
functionSetDbfExact(DbfTable:TTable;ExactOn:boolean) :boolean;
var
errResult:DBIResult;
begin
{如果沒有打開,則操作失敗}
if(notDbfTable.active)then
begin
result:=false;
exit;
end;
{進(jìn)行設(shè)置顯示操作}
errResult:=DbiSetProp(hDBIObj(DbfTable.Handle), curINEXACTON,LongInt(notExactOn));
iferrResult=DBIERR_NONEthen {沒有錯(cuò)誤,操作成功}
result:=true
else{發(fā)生錯(cuò)誤,操作失敗}
result:=false;
end;
五.恢復(fù)被軟刪除的記錄
在Delphi應(yīng)用程序中,對DBF數(shù)據(jù)表執(zhí)行的刪除操作為軟刪除操作.由于物理記錄并沒 有從數(shù)據(jù)表中刪除,我們就可以恢復(fù)被軟刪除的記錄,只要去掉刪除標(biāo)志即可.
要用到的函數(shù)名為DbiUndeleteRecord,函數(shù)原型為:
functionDbiUndeleteRecord (hCursor:hDBICur):DBIResult;
其中,hCursor可為數(shù)據(jù)集的Handle .
下面就是一個(gè)典型的例子.
同樣,應(yīng)在uses語句加上:
DbiTypes,DbiProcs,DbiErrs.
{恢復(fù)被軟刪除的記錄}
functionUndeleteRecord(DbfTable:TTable):boolean;
begin
Result:=false;
{返回false表示函數(shù)執(zhí)行失敗}
withDbfTabledo
begin
{如果數(shù)據(jù)集處于非活動(dòng)狀態(tài),則執(zhí)行失敗}
ifnotactivethen
exit;
{使數(shù)據(jù)集的當(dāng)前記錄與實(shí)際的當(dāng)前記錄的位置一致}
UpdateCursorPos;
{恢復(fù)被軟刪除的記錄}
ifDBIERR_NONEDbiUndeleteRecord(Handle)then
exit;{發(fā)生錯(cuò)誤,操作失敗}
result:=true; {操作成功}
end;
end;
上面是Delphi操作DBF數(shù)據(jù)表的幾個(gè)常見例子,希望Delphi會(huì)給Delphi程序員帶來越來越多的方便,不會(huì)讓Delphi程序員感到約束.
p>
由于Delphi開發(fā)的易用性和快速 性,很多原來使用Foxpro和VisualFoxpro編程的程序員轉(zhuǎn)向了Delphi.但由于工作上或其它的原因,原來的應(yīng)用系統(tǒng)尤其是應(yīng)用數(shù)據(jù),不可能被 一下丟棄,因而需要用Delphi來維護(hù)xBase數(shù)據(jù)庫的應(yīng)用系統(tǒng).本文總結(jié)了在工作和學(xué)習(xí)中的經(jīng)驗(yàn),與廣大Delphi程序員和愛好者共享.
在下面討論中,主要應(yīng)用了BDE的 函數(shù).Delphi1.0沒有提供BDE函數(shù)的幫助文件,請參見Delphi\Doc中的DbiTypes.int、DbiProcs.int和DbiErrs.int三個(gè)文件;在Delphi3.0/4.0中可參見BDE幫助文件.本文 討論的DBF數(shù)據(jù)庫操作主要有:真正刪除記錄、顯示被刪除記錄、獲取當(dāng)前記錄號、設(shè)置查詢匹配方式、恢復(fù)被刪除記錄.
一.真正刪除記錄
在Delphi程序中,用TTable 或TQuery構(gòu)件的方法Delete執(zhí)行刪除記錄的操作時(shí)執(zhí)行的是軟刪除,即相當(dāng)于Foxpro中的SetDeleteOff的效果,僅將記錄用星號*標(biāo)記為刪除, 實(shí)際并沒有數(shù)據(jù)庫中進(jìn)行物理上的刪除.要進(jìn)行真正的刪除,需要進(jìn)行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為要?jiǎng)h除記錄的數(shù)據(jù)表的名稱,
pszDriverType為要?jiǎng)h除記錄的數(shù)據(jù)表的類型,
bRegenIdxs表示是否在刪除記錄后自動(dòng)更新索引文件.
在上面前四個(gè)參數(shù)中,hDb不能為NULL .hCursor、pszTableName、pszDriverType可以為NULL,但必須提供足夠的信息來標(biāo)識數(shù)據(jù)表的文件名稱和類型,當(dāng)hCursor不為空時(shí),pszTableName 和pszDriverType可以為NULL;當(dāng)pszTableName為數(shù)據(jù)表的路徑和文件名時(shí),hCursor和pszDriverType可以為NULL.
值得注意的是,在刪除記錄時(shí),如 果用Table來實(shí)現(xiàn),則Table必須以Exclusive=True的方式打開.下面就是一個(gè)典型的例子.
首先,應(yīng)在uses語句加上:
DbiTypes,DbiProcs,DbiErrs.{Pack一個(gè)DBF數(shù)據(jù)表,DbfTable包含了數(shù)據(jù)表的信息
}
functionPackDbf le(DbfTable:TTable):boolean;
var
errResult:DBIResult;
begin
ifnotDbfTable.Exclusivethen {如果不是以獨(dú)占方式,操作失敗}
begin
result:=false;
exit;
end;
{進(jìn)行刪除操作}
errResult:=DbiPackTable(DbfTable.dbHandle, DbfTable.handle,NIL,NIL,true);
{根據(jù)返回結(jié)果,返回成功與否的標(biāo)志}
iferrResult=DBIERR_NONEthen {沒有錯(cuò)誤,操作成功}
result:=true
else{沒有錯(cuò)誤,操作失敗}
result:=false;
end;
二.顯示或不顯示被軟刪除記錄
當(dāng)DBF數(shù)據(jù)庫中 的記錄被軟刪除后,缺省情況下在TDBGrid等數(shù)據(jù)庫構(gòu)件中是看不見這些 記錄的.我們可以用BDE函數(shù)來控制是否顯示DBF數(shù)據(jù)庫中被軟刪除的記錄,就象在Foxpro中利用語句SetDeleteON/OFF那樣.
要用到的函數(shù)名為DbiSetProp,函數(shù)原型為:
functionDbiSetProp(hObj :hDBIObj;iProp:Longint;iPropValue:Longint):DBIResult;
該函數(shù)用來設(shè)置DBI對象中某個(gè) 屬性的值.
其中:hObj為DBI對象名稱,我 們這里為數(shù)據(jù)表TTable的句柄;
iProp為屬性名稱,我們用的是軟刪除屬性curSOFTDELETEON;
iPropValue為屬性值,我們用True或False表示是否使軟刪除的記錄被顯示.
下面就是一個(gè)典型的例子.同樣,應(yīng)在uses語句加上
DbiTypes,DbiProcs,DbiErrs.
{顯示DBF數(shù)據(jù)表中的軟刪除記錄,DbfTable包含了數(shù)據(jù)表的信息,DeleteOn表示是否顯示,True表示顯示}
functionSetDbfDelete(DbfTable:TTable;DeleteOn:boolean ):boolean;
var
errResult:DBIResult;
begin
result:=false;{操作失敗時(shí),返回False}
{如果數(shù)據(jù)表沒有打開,則操作失敗}
if(notDbfTable.active)then
exit;
{進(jìn)行設(shè)置顯示操作}
errResult:=DbiSetProp(hDBIObj(DbfTable.Handle), curSOFTDELETEON,LongInt(DeleteOn));
iferrResult=DBIERR_NONEthen{沒有錯(cuò)誤,則操作成功 }
begin
result:=true;
DbfTable.refresh;
end;
end;
三.獲取當(dāng)前記錄號
在用Foxpro 時(shí),RecNo()函數(shù)用慣了,在Delphi程序沒有這樣的函數(shù)覺得別扭.下面我 們可以用BDE函數(shù)獲取當(dāng)前記錄在數(shù)據(jù)集中的記錄號.
要用到的函數(shù)名為DbiGetRecord,函數(shù)原型為:
functionDbiGetRecord(hCursor :hDBICur;eLock:DBILockType;pRecBuff:Pointer;precProps:
pRECProps):DBIResult;
該函數(shù)用來取得當(dāng)前記錄的一些屬性.
其中:hCursor可為數(shù)據(jù)集的Handle,
eLock為對記錄加鎖的類型,
pRecBuff存放記錄的緩沖區(qū),
precProps為記錄屬性集.
下面就是一個(gè)典型的例子.同樣,應(yīng)在uses語句加上:
DbiTypes,DbiProcs,DbiErrs.
{取得當(dāng)前記錄的記錄號}
functionRecNo(ADbfTable:TTable):LongInt;
var
RecordProps:RecProps;
begin
Result:=0;{返回0表示函數(shù)執(zhí)行失敗}
withADbfTabledo
begin{如果數(shù)據(jù)集處于非活動(dòng)狀態(tài),則執(zhí)行失敗}
ifnot activethen
exit;
{使數(shù)據(jù)集的當(dāng)前記錄與實(shí)際的當(dāng)前記錄的位置一致 }
UpdateCursorPos;
{取得當(dāng)前記錄的屬性,主要是記錄的位置}
ifDBIERR_NONE$#@60; DbiGetRecord(Handle,dbiNOLOCK,nil,@RecordProps)then
exit;{發(fā)生錯(cuò)誤,則操作失敗}
Result:=RecordProps.iPhyRecNum; {取得記錄號}
end;
end;
四.設(shè)置查詢匹配方式(精確匹配/非精確匹配)
在用Foxpro時(shí),Set ExactON/OFF對數(shù)據(jù)查詢影響很大.在Delphi中,我們同樣可以進(jìn)行這樣的設(shè)置.要用到的函數(shù)名為DbiSetProp,這次用的屬性名稱iProp為curINEXACTON, 屬性值iPropValue為True或False,True表示SetExactOFF.
下面就是一個(gè)典型的例子.
同樣,應(yīng)在uses語句加上:
DbiTypes,DbiProcs,DbiErrs.
{設(shè)置匹配方式,DbfTable包含了數(shù)據(jù)表的信息,ExactOn表示是否精確匹配,True表示是}
functionSetDbfExact(DbfTable:TTable;ExactOn:boolean) :boolean;
var
errResult:DBIResult;
begin
{如果沒有打開,則操作失敗}
if(notDbfTable.active)then
begin
result:=false;
exit;
end;
{進(jìn)行設(shè)置顯示操作}
errResult:=DbiSetProp(hDBIObj(DbfTable.Handle), curINEXACTON,LongInt(notExactOn));
iferrResult=DBIERR_NONEthen {沒有錯(cuò)誤,操作成功}
result:=true
else{發(fā)生錯(cuò)誤,操作失敗}
result:=false;
end;
五.恢復(fù)被軟刪除的記錄
在Delphi應(yīng)用程序中,對DBF數(shù)據(jù)表執(zhí)行的刪除操作為軟刪除操作.由于物理記錄并沒 有從數(shù)據(jù)表中刪除,我們就可以恢復(fù)被軟刪除的記錄,只要去掉刪除標(biāo)志即可.
要用到的函數(shù)名為DbiUndeleteRecord,函數(shù)原型為:
functionDbiUndeleteRecord (hCursor:hDBICur):DBIResult;
其中,hCursor可為數(shù)據(jù)集的Handle .
下面就是一個(gè)典型的例子.
同樣,應(yīng)在uses語句加上:
DbiTypes,DbiProcs,DbiErrs.
{恢復(fù)被軟刪除的記錄}
functionUndeleteRecord(DbfTable:TTable):boolean;
begin
Result:=false;
{返回false表示函數(shù)執(zhí)行失敗}
withDbfTabledo
begin
{如果數(shù)據(jù)集處于非活動(dòng)狀態(tài),則執(zhí)行失敗}
ifnotactivethen
exit;
{使數(shù)據(jù)集的當(dāng)前記錄與實(shí)際的當(dāng)前記錄的位置一致}
UpdateCursorPos;
{恢復(fù)被軟刪除的記錄}
ifDBIERR_NONEDbiUndeleteRecord(Handle)then
exit;{發(fā)生錯(cuò)誤,操作失敗}
result:=true; {操作成功}
end;
end;
上面是Delphi操作DBF數(shù)據(jù)表的幾個(gè)常見例子,希望Delphi會(huì)給Delphi程序員帶來越來越多的方便,不會(huì)讓Delphi程序員感到約束.
下載本文示例代碼
在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫在Delphi程序中維護(hù)DBF數(shù)據(jù)庫
閱讀(38) | 評論(0) | 轉(zhuǎn)發(fā)(0) |
總結(jié)
以上是生活随笔為你收集整理的delphi query 存储为dbf_在Delphi程序中维护DBF数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv轮廓周长原理_OpenCV3
- 下一篇: fedora yum mysql_Fed