pb報錯:Datawindow does not have UPDATE capability.
解決方向:可能是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.