一DATAWINDOW的四個緩站區
在PowerBuilder中DataWindow是用戶前端用來存儲操縱數據的對象在每一個DataWindow對象中有個二維表作為數據緩沖區用來存儲查詢到的數據用戶在DataWindow中對數據處理系統內部的操作實際上都是將數據在這幾個緩沖區中進行的修改和移動最後在用戶提交數據庫時系統根據這四個緩沖區中的信息形成SQL的INSERTUPDATEDELETE等語句這四個緩沖區是:
1Primary Buffer
這個緩沖區是存放填充窗口中DataWindow控件中數據的調用DataWindow的Retrieve()函數和InsertRow()函數可以將數據填入這個緩沖區中當使用有關DataWindow刪除和過濾函數時相應記錄將從這一緩沖區中刪除而在執行DataWindow的Update()函數時PowerBuilder將查看這一緩沖區中的記錄以形成SQL INSERT和UPDATE語句
2Delete Buffer
這個緩沖區保存的是用DeleteRow()函數從Primary Buffer中刪除的記錄執行Update()函數時系統根據這一緩沖區的記錄形成DELETE語句
3Filter Buffer
這個緩沖區存儲的是從Original Buffer使用Filter()函數過濾到Primary Buffer中後剩余的記錄
4Original Buffer
這一緩沖區存儲的是DataWindow最初執行retrieve()函數時得到的全部記錄當提交數據庫時根據Primary Buffer生成的UPDATE語句和根據Delete Buffer生成的DELETE語句都要依據這一緩沖區來構造這些SQL語句中的Where子句
Original Buffer由PowerBuilder內部維護PowerBuilder所提供的任何函數都無法改變它的值不過通過PowerBuilder所提供的GetItem…系列的函數可以讀出DataWindow最初從數據庫中查到的原始值通過這些函數我們可以編程實現所謂的Undo功能並且得到在使用樂觀鎖時形成提交數據庫的WHERE子句
如果您當前使用的DataWindow沒有設置修改的權力您將不能對Delete緩沖區和Original緩沖進行操作而且當調用Update()時也將引起系統錯誤
二數據緩沖區的狀態值
Primary Buffer和Delete Buffer都有行級和列級的狀態值這個狀態值是一個枚舉類型在提交時由該行的狀態值來決定是否要產生SQL語句其中Primary Buffer產生的是INSERT和UPDATE語句而Delete Buffer產生的是DELETE語句我們用GetItemStatus()函數和SetItemStatus()函數可以對這一狀態值作操縱這一枚舉狀態有以下四種:
·NotModified!———該行或行的值為查詢所得沒有發生改變
·DataModified!———該行或列的值為查詢所得發生了改變
·New!———該行或列為一插入的新行數據沒有發生改變(數據為空或缺省值)
·NewModified!———該行或列為一插入的新行數據發生改變改變是通過用戶鍵盤輸入或調用了SetItem()函數
讓我們來看下面這一實例:
我們有這樣一張表表中有三個字段其中ITEM是主鍵
ITEM CHAR();
NAME CHAR();
QUANTITY INT
在Script中我們查詢這張表的記錄得到以下這些信息存儲了在Primary和Origianal Buffer中其中的行號是緩沖區加上的!TB gif
在窗口中我們編程過濾掉數量為的行並且加上一個空行:
dw_SetFilter(quantity=)
dw_Filter()
dw_InsertRow()
這時Primary Buffer的狀態為:!TB gif
在Filter Buffer中的記錄為:!TB gif
用戶在新插入行中輸入數據刪除了第行數據並修改了第行數據當他離開這個DataWindow時Primary和Delete緩沖區的狀態如下:!TB gif
這時執行dw_update()函數系統將基於這兩個緩沖區生成SQL語句!TB gif
在Primary Buffer中狀態為NotModified和New!的行將被忽略而不產生SQL語句狀態為DataModified的行將產生UPDATE語句狀態為NewModified的行將產生INSERT語句在Delete緩沖區中的行將產生DELETE語句
三四個緩沖區在編程中的運用
某些DataWindow控件的函數有指定DataWindow緩沖區的功能如果缺省則表示Primary緩沖區下列是可以指定緩沖區的函數:
·GetItemStatus()
·GetNextModified()
·GetUpdateStatus()
·SetItemStatus()
此外還有GetItem…系列的函數用以查詢DataWindow中的值這些函數有:
·GetItemDate()
·GetItemDataTime()
·GetItemDecimal()
·GetItemNumber()
·GetItemString()
·GetItemTime()
From:http://tw.wingwit.com/Article/program/SQL/201311/16430.html