1. 程式人生 > >pb報錯:Datawindow does not have UPDATE capability.

pb報錯:Datawindow does not have UPDATE capability.

之一 介紹 因此 處理 span power 是否 ica ber

解決方向:可能是dw下,rows------>Update properties---------->有設置(此設置具體介紹如下)

PowerBuilder中可以通過數據窗口的更新屬性(Update Properties)來實現並發控制。打開 DataWindow 畫筆板,點擊 Rows->Update Properties菜單,進入“Specify Updatae Properties”對話框,其中“Where Clause for Update/Delete”組合框中的三個選項就是三種處理數據並發問題的策略。

技術分享

1、選項“Key Columns”:

這種情況是比較更新前後Table的關鍵字是否發生了變化,即當前數據庫中關鍵字的實際值和最初查詢的值做比較,如果沒有改變,則可以更新,反之不能更新。

如用戶A將員工號為100的職員的salary字段值改為1200並保存後,B用戶也將員工號為100的職員的salary字段值改為950並點擊“存盤”按鈕,我們可以看到數據窗口sqlpreview事件中的sqlsyntax返回如:

UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100

因為關鍵字id=100沒有發生變化,Where條件成立,更新成功,將A用戶的修改覆蓋,salary值變為950元,員工損失了200元。顯然這樣沒有達到並發控制的目的,未能保證數據的完整性。

2、選項“Key and Updateable Column”:

這種情況是比較更新前後Table的關鍵字和可修改(更新)的列值是否發生了變化,如果沒有一項發生改變,更新成功;反之,若數據庫中當前值中若任一項與數據窗口最初檢索出的值不一致,則更新失敗。對於此例,因所有字段都是可修改(更新)的,即檢測是否有任一字段變化。

同上,當用戶A更新完後,B用戶點擊“存盤”按鈕,我們可以看到sqlsyntax返回如:

UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "name" = ‘令狐沖‘ AND "birthday" = ‘1975-05-01‘ AND "technical_post" = ‘工程師‘ AND "salary" = 1000 AND "notes" = ‘軟件開發‘

顯然,id字段沒有改變,而可修改(更新)列之一salary的值經A用戶修改存盤後,已由1000變為了當前的1200,where條件不成立,因此更新失敗,並彈出出錯信息如下:

Row changed between retrieve and update.

No changes made to database.

UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "name" = ‘令狐沖‘ AND "birthday" = ‘1975-05-01‘ AND "technical_post" = ‘工程師‘ AND "salary" = 1000 AND "notes" = ‘軟件開發‘

此時點擊《刷新》按鈕,我們可以看到,salary的值仍為1200,達到了並發控制的目的,保證數據的完整性。

3、選項“Key and Modified Columns”:

這種情況是比較更新前後Table的關鍵字和要修改(更新)的列值是否發生了變化,如果沒有改變,更新成功,反之更新失敗。對於本例,即判斷關鍵字id和將要修改字段salary是否發生變化。

同上,當用戶A更新完後,B用戶點擊“存盤”按鈕,我們可以看到sqlsyntax返回如:

UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "salary" = 1000

這裏id字段沒有改變,而此次將要修改的列salary值已由1000變為了1200,where條件不成立,因此更新失敗,並彈出出錯信息如下:

Row changed between retrieve and update.

No changes made to database.

UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "salary" = 1000

此時我們點擊《刷新》按鈕,我們可以看到,salary的值仍為1200,也達到了並發控制的目的。

再舉一個例子:

如果A用戶更新的是備註notes字段,而B用戶更新的是薪水salary字段,按照業務,這種操作是允許的,而在PB中會如何處理呢?

1、對於選項“Key Columns”: 因為關鍵字沒有改變,更新成功。

2、對於選項“Key and Updateable Column”:

當用戶A更新完後,B用戶點擊“存盤”按鈕,我們可以看到sqlsyntax返回如:

UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "name" = ‘令狐沖‘ AND "birthday" = ‘1975-05-01‘ AND "technical_post" = ‘工程師‘ AND "salary" = 1000 AND "notes" = ‘軟件開發‘

這裏,id字段沒有改變,salary字段也沒有改變,但可修改(更新)列之一notes的值經A用戶的修改,已由“軟件開發”變為了“硬件維護”,where條件不成立,因此更新失敗,系統將報出錯信息。

此時點擊《刷新》按鈕,可以看到,salary的值仍為1200,notes的值為“硬件維護”。

3、對於選項“Key and Modified Columns”:

當用戶A更新完後,B用戶點擊“存盤”按鈕,我們可以看到sqlsyntax返回如:

UPDATE "personnel" SET "salary" = 950 WHERE "id" = 100 AND "salary" = 1000

這裏,id字段沒有改變,而將要修改的列salary值也沒有改變(A用戶只是修改了notes字段),where條件成立,因此更新成功。

此時點擊《刷新》按鈕,可以看到,salary的值為950,notes的值為“硬件維護”。註意這裏B用戶只是修改salary字段,並不修改notes字段,因此notes保留了A用戶修改後的值。

從上面例子中我們可以得出如下結論:

1、“Key Columns”選項在控制數據完整性方面最弱,它所允許的並發操作是最多的,所禁止的並發操作發生的可能性非常小,只有當主鍵被更改後才起並發控制作用,當一條記錄的關鍵字改變了才進行控制,這顯然沒有多大意義。實際上這種方法一般只在單機版的應用程序中使用,而在Client/Server模式中是很少使用的。

2、“Key and Updateable Columns”的是PB的默認選項,控制最為嚴格,可以實現最安全的並發控制,充分保證數據的完整性,但它也會禁止我們做一些本當允許的並發修改(如上面所說的第二例),是並發能力最差的方法。

3、“Key and Modified Columns”選項可以說是前兩者的折衷,在控制數據完整性和嚴格性方面比第一項強,比第二項弱,在允許的並發操作數量方面比第一項少,比第二項多。

至於在程序中選取哪一種控制比較合適,我們應該根據應用的具體情況來選擇。

對於並發控制,我們還需要在程序中捕獲 DBMS 的出錯號,再顯示相應的錯誤信息,否則PowerBuilder給出的那些出錯信息,一般用戶是看不懂的。這項功能可在數據窗口的dberror事件中編寫代碼實現。

pb報錯:Datawindow does not have UPDATE capability.