pb中資料視窗緩衝區與資料修改狀態
摘 要:文章描述了powerbuilder中資料視窗緩衝區,詳細介紹了資料視窗中行與列的修改狀態以及powerbuilder提供的相關函式,並給出了幾則應用例項。
中圖分類號:tp311.131
文獻標識碼:a
powerbuilder是當今最先進的資料庫開發工具之一,它以 開放性、可移植性以及易用性而聞名於世。powerbuilder的突出特點是給應用開發人員提供了非常方便的開發環境和工具,而資料窗**術則是其中最 耀眼的閃光點。利用資料視窗,開發人員可以完成絕大多數資料操作任務。本文從資料視窗中資料的修改狀態的角度出發,介紹利用資料視窗進行應用開發的一些技 巧。
1 資料視窗緩衝區
在應用中,每個資料視窗控制項都要檢索4個記憶體緩衝區,它們是:
·主緩衝區(primarybuffer):存放檢索出來的資料,但不包括過濾掉和刪除掉的資料。
·過濾緩衝區(filterbuffer):存放從主緩衝區中過濾掉的資料。
·刪除緩衝區(deletebuffer):存放從主緩衝區中刪除掉的資料。
·原始緩衝區(originalbuffer):存放從資料庫裡檢索到的原始資料,它由powerbuild在內部維護,可以利用該緩衝區中的資料進行資料恢復,在應用程式中實現undo功能。
2 行與列的修改狀態
行與列的修改狀態在powerbuilder中為dwitemstatus列舉型別值,它們包含: ·notmodified!:指定行或列處的資訊與最初檢索出的相同。 ·datamodified!:指定列或行中某列處的資訊在檢索出後發生了改變。
·new!:指定行是新行,但此行的列並未賦值。本狀態只適用於行,不適用於單個列。
·newmodified!:指定行是新行且行中的列已經賦值。新行的狀態成為newmodified!,既可能是使用者輸入或使用setitem函式造成的,也可能是由於它的某列具有預設值。本狀態只適用於行,不適用於單個列。
資料視窗中行或列的修改狀態決定update()函式將為該行或該列產生何種型別的sql語句。 對主緩衝區和過濾緩衝區中的行,update為狀態是newmodified!的行產生insert語句,為狀態是datemodified!的行產生 update語句,只有狀態是datamodified!的列才會包含在update語句中。對刪除緩衝區中的行,若其狀態是new!或 newmodified!,則update語句不會為其產生update語句。
利用函式getitemstatus可獲得某行或某列的修改狀態,利用函式setitemstatus可改變某行或某列的修改狀態。
語法:dwcontrol.getitemstatus(row,column,dwbuffer)
dwcontrol.setitemstatus(row,column,dwbuffer,status)
對於如何改變狀態,powerbuilder有一些限制,表1給出了這種限制,其中yes表示可把初始狀態改變為指定狀態,no則表示不可以。
表1資料修改狀態設定約束
初始狀態
指定狀態
new!
newmodified!
datamodified!
notmodified!
new!
——yes
yesno
newmodified!
no——
yesnew!
datamodified!
newmodified!
yes——
yesnotmodified!
yesyes
yes——
通過觀察表1,我們可以發現這樣一種情況:假設某個記錄的狀態為new!,那麼不能直接改為notmodified!但可先將它改為datamodified!,然後再改為notmodified!。
利用函式rowscopy、rowsmove可以在不同datawindow控制項(或datastore物件)之間或同一datawindow控制項(或datastore物件)的不同緩衝區之間複製、移動資料行。
語法:dwcontrol.rowscopy(startrow,endrow,copybuffer,targetdw,beforerow,targetbuffer)
dwcontrol.rowsmove(startrow,endrow,movebuffer,targetdw,beforerow,targetbuffer)
當某行在刪除緩衝區中時,或者在主緩衝區或過濾緩衝區中,並且狀態為newmodified!或 datamodified!時,其更新標誌被設定。函式resetupdate清除datawindow或datastore中主緩衝區和過濾緩衝區中的 更新標誌並清空其刪除緩衝區。清除更新標誌後,所有行的狀態為notmodified!或new!。
語法:dwcontrol.resetupdate()
3 應用舉例
(1)在資料視窗中,某些列常具有預設值,或我們在執行了insertrow操作後立即使用 setitem函式為某些列賦值。如果使用者執行了乙個插入操作後立即關閉視窗會觸發closequery事件,這時會提示使用者記錄已經被修改,但使用者並沒 有感覺到對資料的修改。為避免出現這種情況,可作如下處理:
intli_new_row
li_new_row=dw_l.insertrow(0)
//通過setitem函式為列賦值
dw_l.setitem(……)
//將新行的修改狀態置為notmodified!
dw_l.setitemstatus(li_new_row,0,primary!,notmodified!)
(2)在應用程式中提供undo功能,將實現很好的使用者友好效果。本例中將資料視窗dw_l中的當前行、當前列的顯示值置為從資料庫中檢索出的原始值:
string ls_ori_val
ls_ori_val=dw_l.getitemstring(dw_l.getrow(),dw_l.getcolumn(),
&primary!,true)
dw_l.settext(ls_ori_val)
(3)在協調兩個datawindow物件dw_l、dw_2的更新時,若其中乙個更新失敗,應阻止重設更新標誌,以便回滾事務,一旦所有資料視窗都已成功更新,就可使用commit結束該事務,並使用resetupdate重新設定資料視窗的狀態標誌。
int li_ret_code
li_ret_code=dw_l.update(true,false)//阻止重設更新標誌
if li_ret_code=l then
li_ret_code=dw_2.update(true,false)//阻止重設更新標誌
lf li_ret_code=l then
dw_l.resetupdate()//清除更新標誌
dw_2.resetupdate()//清除更新標誌
commit;
else
rollback;
endif
endif
(4)將資料行從刪除緩衝區移到主緩衝區,實現取消刪除的功能。
dw_l.rowsmove(l,dw_l.deletedcount(),delete!,dw_l,l,primary!)
c清除緩衝區資料
如何清空輸入緩衝區的內容 c標準規定 fflush stdout 緩 存的。對 於輸入 stdin 它是沒有定義的。但是有些編譯器也定義了 fflush stdin 的實現,比如微軟的 vc。其它編譯器是否也定義了 fflush stdin 的實現應當查詢它的手冊。gcc編譯器沒有定義它的實現,所以...
ORACLE資料緩衝區DB cache
oracle資料緩衝區db cache db cache是以資料塊為單位組織的緩衝區,資料庫剛剛啟動的時候,db cache中幾乎沒有使用者資料的緩衝,當會話訪問資料庫中的表或索引時,首先會檢查db cache中是否存在該資料,如果不存在,就會從資料檔案中讀取該資料塊到db cache中,然後再從d...
輸入緩衝區資料殘留問題
有時當編譯器執行完後,結果介面不會停在,而是一閃而沒,看不到執行結果。在結尾加上getchar同樣一閃而沒。這是因為程式讀入資料是從讀入緩衝區讀取的,當讀入緩衝區有資料殘留時就會直接從緩衝區讀入資料,不會等待輸入,就會出現上述結果。解決辦法有兩種 1 清空緩衝區資料。利用fflush stdin 函...