用Delphi如何實現VFP中的Cache特性 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 用Delphi如何實現VFP中的Cache特性 作者: 新疆化工學校 馬向東 ---- 在VFP50中編程,因?其本身以資料庫?核心的操作方式,Cache(資料緩衝)工作方式是其本身固有的,當把一個VFP程式向Delphi中轉移時,?提高資料處理速度,應使用其在Delphi2.0以後版本增加的資料庫緩衝機制。Delphi的緩衝機制本身不僅提高了資料處理的性能,同時還帶來了新的特性,增強了資料處理的靈活性。 ---- 與緩衝機制有關的屬性和方法如下,只有在緩衝機制下,即CachedUpdates:=True時,以下屬性和方法才有效: ---- CachedUpdates(屬性):?True時,打開緩衝機制。
---- UpdatesObject(屬性):可以放置一個TUpdateSql元件的SQL語句,並可自動執行,也可以由OnUpdateRecord事件處理程式調用。
---- UpdatesPending(屬性):緩存中資料是否改變,True:改變。
---- ApplyUpdates(方法):將緩衝資料存檔。
---- CommitUpdates(方法):與ApplyUpdates合作,緊跟之後,將緩衝資料存檔。
---- CancelUpdates(方法):取消緩存中的所有更新。
---- RevertRecord(方法):恢復當前記錄的原有資料,取消資料更改。
---- UpdateRecord(方法):將緩衝資料存檔。
---- UpdateStatus(函數):返回記錄的更新狀態,共有四種狀態,usUnmodified,usModified,usInserted,usDeleted,可供查詢。 ---- 瞭解緩衝機制的屬性和方法後,用一個電話管理程式來說明。如圖1(略) ---- 東西不多,一個TDBGrid,三個Button,四個CheckBox,一個Table和一個DataSource,一個Navigator。將Table.ChacedUpdates屬性設置?True,加入三個欄位,其中一個State欄位是一個計算欄位,欄位值在DhbTable的OnCalcFields事件中定義,如下: procedure TForm1.DhbTableCalcFields(DataSet: TDataSet); begin If DhbTable.UpdateStatus
=usUnmodified Then DhbTableState.Value:='原有記錄'; //這兩種訪問欄位的方式是等價的
If DhbTable.UpdateStatus =usModified Then DhbTable.FieldByName('State').asString:='已修改記錄';
If DhbTable.UpdateStatus =usInserted Then DhbTable.FieldByName('State').asString:='新增記錄';
If DhbTable.UpdateStatus =usDeleted Then DhbTable.FieldbyName('State').asstring:='已刪除記錄';
end;
---- 這個在DhbTable中定義的計算欄位表達了每個記錄現有的狀態,而如何在DBGrid中顯示這些欄位由四個CheckBox控制,它們共用了一個事件控制碼,如下:
procedure TForm1.CheckBox1Click(Sender: TObject); var UpdataTypes:TUpdateRecordTypes;
begin UpdataTypes:=[]; If CheckBox1.Checked then Include(UpdataTypes,rtUnModified); If
CheckBox2.Checked then Include(UpdataTypes,rtModified); If CheckBox3.Checked then
Include(UpdataTypes,rtInserted); If CheckBox4.Checked then Include(UpdataTypes,rtDeleted);
DhbTable.UpdateRecordTypes :=UpdataTypes; end; ---- rtModified, rtInserted, rtDeleted, rtUnmodified這四個常量分別定義了緩衝狀態下的四種顯示狀態。若四種都沒有選擇,默認狀態是除了rtDeleted以外的三種狀態集合。DhbTable根據其屬性UpdateRecordType集合中的值自動顯示相應的記錄。 ---- 三個按鈕首先判斷緩衝中是否有變化,若有,分別執行緩衝操作指令。OKButton是存檔,CancelAllButton是取消所有更新,RevertThisButton是恢復當前記錄的改變(如果有變化)。代碼如下: procedure TForm1.OKButtonClick(Sender: TObject); begin If DhbTable.UpdatesPending then
DhbTable.ApplyUpdates; DhbTable.CommitUpdates; end; procedure TForm1.CancelAllButtonClick
(Sender: TObject); begin If DhbTable.UpdatesPending then DhbTable.CancelUpdates; end;
procedure TForm1.RevertThisButtonClick (Sender: TObject); begin If DhbTable.UpdatesPending
then DhbTable.RevertRecord; end;
---- 然後,運行這個小程式,感覺一下緩衝的效果,先增加一批記錄,修改一批記錄,再刪除幾個記錄,單擊四個CheckBox,看一看不同選擇下的顯示方式,試著恢復刪除或修改的記錄,絕對錯不了。 ---- 要注意的是,在緩衝機制下,如果用POST,或Refresh或用: Table.Close Table.Open ---- 後,修改的資料並沒有存入到資料庫中,如果要存檔,必須使用: Table.ApplyUpdates;
Table.CommitUpdates;
---- 這才是緩衝機制下存檔的正確方法。
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |