pb報錯:Datawindow does not have UPDATE capability.

來源:互聯網
上載者:User

標籤:base   意義   let   對話   error   --   preview   硬體   nbsp   

解決方向:可能是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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.