PowerBuilder DataWindow畫板的更新特性詳解

Penho發表於2016-12-20

根據當前應用程式的需要和資料完整性的需要去改變DataWindow的更新選項。

要改變DataWindow物件執行更新操作的方式,可從Rows選單下選擇Update Properties,開啟Specify Update Properties對話方塊。(如下圖)

更新特性對話方塊

對話方塊分為5塊內容:

1.指定允許更新選項及要更新的表

如果DataWindow中的資料不止是查詢,需要更新的話,勾選Allow Updates,並在Table to Update下拉框指定要更新的一張表,下拉框的預設選項是資料來源中的表或者檢視。如果檢視含多張表,必須指定檢視中的一張表。

2.指定可以更新的列和鍵列

Updateable Columns框中選藍要更新的列,如果在資料來源中擁有多於一張的表,使用者僅能更新其中一張表中的各列,儘管所有的列名都出現在列表框中。
Unique Key Column(s)框選擇能唯一標識行的列(或複合列)。如果在資料來源的SQL Selection List中已經指定了主鍵標,使用者可以單擊Primary Key按鈕。

3.指定執行更新和刪除SQL時的where子句(Where Clause for Update/Delete)

Where Clause for Update/Delete組合框包含了三個單選按鈕,它們為維護資料的完整性提供了三種選項,併為資料庫加鎖提供了不同的選擇。當某行被選擇時,使用者可以通過DataWindow物件來提供完整性保護而不是給某行或某頁上鎖(取決於資料庫加鎖機制)並防止其他使用者檢索該行。這三個選項為:Key Columns, Key and Updateable Columns和Key and Modified Columns。

3.1 Key Columns

指定了該選項,DataWindow將只使用在Unique Key Column(s)框中指定的鍵標列。此選項通常用於單使用者應用程式中。當PowerBuilder生成Update或Delete語句時,它將比較某行檢索的原始鍵標列值和當前資料庫中此行的鍵標列值,如果兩個值相等,更新和刪除操作才會成功。

例如:假設Malcolm和Jonathan從顧客表檢索到下列行,Customer_Id為主鍵,姓名,狀態和地區為可更新列:
Customer_Id:110
Customer_Name: Simon Herbert
Status:Perferred
Region:Midwest

如果Jonathan將地區從Midwest改成Southeast,將使用鍵標列產生以下UPDATE語句:

UPDATE  customer
SET region = "Southeast"  
WHERE customer_id = 110  --Key Column; 

此UPDATE語句將成功地被執行。如果Malcolm也要改變此行(例如,將地區變為Northwest),也會成功執行,但會出現完整性問題。Jonathan的改變將被覆蓋,因為鍵標列沒被改動。因此,這個示例中,使用者擁有高度併發性(兩個使用者都可訪問和更改資料),但資料的完整性卻非常差。

Malcolm改變此行時產生的UPDATE語句:

UPDATE  customer
SET region = "Northwest"  
WHERE customer_id = 110  --Key Column; 

3.2 Key and Updateable Columns

指定了該選項,PowerBuilder生成Update或Delete語句時,將比較原始鍵標列值、任何可更新列的原始檢索值和當前資料庫中這些列的值作比較。如果值都相等,更新和刪除操作才會成功。這是推薦使用的方法,因為它提供了高度的資料完整性。

UPDATE customer
SET region = "Southeast"
WHERE customer_id = 110     --Key Column
AND name = "Simon Herbert"  --Updateable Column
AND status = "Perferred"    --Updateable Column
AND region = "Midwest"      --Updateable Column

Jonathan的更新操作將會成功。如果Malcolm又想改變地區,並試圖進行更新,更新操作將會失敗,因為WHERE子句沒有改變,但是地區值現在是Southeast而不是Midwest。使用Key and Updateable Columns,儘管併發程度很低,但資料完整性卻要高得多。

3.3 Key and Modified Columns

指定了該選項,PowerBuilder生成Update或Delete語句時,將比較原始鍵標列值、將要更改的可更新列的原始檢索值和當前資料庫中這些列的值作比較。如果值都相等,更新和刪除操作將會發生。此方法是前兩者的折衷形式。對於同一示例,如果兩使用者都想改變同一行的相同的列(例如region),第一個更新操作成功,第二個將失敗,SQL語句將如下所述:

UPDATE customer
SET region = "Southeast"
WHERE customer_id = 110     --Key Column
AND region = "Midwest"      --Modified Column

如果前一個更新執行後,接著另一使用者修改同一行記錄的狀態欄位,由Preferred改為Exceptional,SQL語句如下所示:

UPDATE customer
SET status = "Exceptional"
WHERE customer_id = 110       --Key Column
AND status = "Preferred"      --Modified Column

這個更新操作將會成功,儘管資料已經改變了(region不同了)。因此在這種情況下資料完整程度低而併發程度高。此選項可用於兩個使用者同時修改相同的行時的情況,只要他們改變的是不同的列資料。

4 指定鍵列的修改方式(Key Modification)

指定的是如果使用者改變了鍵標列值,更新操作將怎樣發生。兩個選項:Use Delete Then Insert和Use Update。

第一個選項是在刪除了列以後,再用新的鍵值插入一個新的行。此選項減少了在資料庫中重新組織的工作量,但它有著潛在的問題。如果主鍵是另一張表的外來鍵並被指定為級聯刪除,使用者可能就不想使用Use Delete Then Insert了。

警告:除了有觸發級聯刪除的可能性之外,如果使用者只檢索表列中的一部分,update選項還是有用的。如果使用者僅僅檢索表20列中的5列並改變了主鍵值,使用Use Delete Then Insert選項會引起整行被刪除,而且沒有被檢索的15個列中的資料將被丟失。

第二個選項將更新行中的鍵值。新的鍵值包含在更新過程中,和其他資料在一起,這就防止了外來鍵和級聯刪除的問題。首選使用Use Update選項。

5 指定標識列(Identity Column)

此列表框用於為下拉選單中所指定的列(通常是鍵標列)生成序號。此選項僅僅用於支援序號生成的DBMS(也稱為自增列)。通常不指定,選擇None。

警告:如果使用者指定了一個列為標識列,就不要將其選作為一個可更新列。如果確實想將該列選作可更新列,則對資料庫執行的任何UPDATE都將失敗。

補充實驗:

新建一個DataWindow,指定第三點的Key and Updateable Columns,使用者A和使用者B同時更新同一行記錄,使用者A更新成功。而使用者B接著提交更新時會收到報錯Row changed between retrieve and update。無法更新。報錯截圖如下:

這裡寫圖片描述

而指定為Key Columns,使用者A、B都檢索出同一條記錄,則使用者A更新成功,使用者B更新也會成功且將A的修改覆蓋了。如果使用者B與使用者A沒有溝通的話,使用者A就會感到莫名其妙,為什麼我修改的資訊被覆蓋了。使用者B也不曾知道該記錄曾被A修改過。資料完整性體驗極差。

相關文章