2014-02-21 90 views
0

正如標題所示,我的代碼中嵌入了一個看似簡單的嵌入式SQL Update語句,該語句掛起了Powerbuilder 12.5。SQL UPDATE語句掛起Powerbuilder

UPDATE COMMENTS SET comment_text = :strNewComment 
WHERE ID = :lngID; 

我已經看了調試代碼;所有變量都具有有效值並且執行完全停止在該SQL語句上。

我唯一可能會發生這種情況的理論是,可能存在鎖定問題,因爲數據窗口中打開的數據是相同的,但我不夠PB的專家知道它是否是。

圍繞此場景的一點背景信息:數據窗口網格顯示註釋列表。用戶選擇評論行,點擊「編輯」按鈕並點擊它的點擊事件。模式窗口在文本框中顯示註釋文本。用戶編輯評論文本,點擊確定按鈕。點擊事件繼續,運行上面的sql語句,然後使用Retrieve()調用刷新數據窗口。

感謝

+0

你可以手動運行sql數據庫嗎? –

+0

是的,相同的sql(減去變量)在Interactive SQL中正常運行。 – voon

+0

你在sqlcode中遇到任何錯誤嗎? – Slapout

回答

2

所以我(意外)設法找到是什麼導致我的問題。

我已經通過交互式SQL插入了一些測試記錄,然後在開發期間試圖編輯這些記錄。問題是... 鼓卷 ...我忘了承諾手動插入記錄!記錄將被交互式SQL鎖定,直到提交/回滾或(在我的情況下)關閉交互式SQL。每當我遇到這個問題時,我都會僥倖通過這些手動插入的記錄。

所以,這裏沒什麼可看的。只是一個SQL Anywhere新手的錯誤。感謝你的幫助。

6

這不是我將如何實現它...發送更新的案文回調用程序(很多方法可以做到這一點......),然後做一個SetItem()進入電網DW 。從那裏,你可以立即調用你的grid dw的Update(),或者等待更多的更新被收集並且一次更新它們。

完全模仿現有數據窗口功能的嵌入式SQL更新是糟糕的設計選擇。

+0

謝謝。我能夠沒有任何錯誤地使用SetItem。但是,在調用update和commit之後,數據會在網格中直觀更新,但不會在數據庫中更新。重新檢索相同的記錄會導致返回的原始數據。 – voon

+0

這可能是在某種程度上與另一個DW在同一窗口上相關?實際上,這個其他DW是窗口上的原始/主DW。評論網格DW是窗口的新增內容。兩個DW都在單獨的數據庫表上工作,所以除了共享相同的sqlca對象外,我無法看到其中一個如何影響另一個。 我注意到,如果我在註釋DW上編輯記錄,然後更新主DW中的一個字段,註釋DW將恢復/刷新回原始數據。這意味着兩個DW之間的某種連接... – voon

+1

確保在DataWindow中將列設置爲可更新。如果您的應用程序是PFC,則可以使用SQL Spy服務來檢查數據庫的內容。否則,在DataWindow的SQLPreview事件中放入諸如beep(1)之類的東西,以便可以在那裏設置斷點。 –

0

我不知道你在用什麼數據庫,但如果它被佔用一行鎖,這是我期望的行爲。

@NoazDad是一個非常有經驗的PowerBuilder人,儘管他目前在SO上有71分。我會接受他的建議(,這也是我的工作方式)。

+0

數據庫是SQL Anywhere 12.是否有可以更改的datawindow屬性,以便它不鎖定行? – voon

+0

對不起,我不知道SA了。 – DaveE

2

如果你用這種方式更新數據庫已經死了,那麼我會看看你的數據窗口顯示記錄列表。也許嵌入式SQL試圖更新鎖定的數據,我認爲這可能會導致掛起。鎖應顯示在數據庫上。如果您沒有通過數據窗口進行更新,請考慮選擇「只讀」。

我得到了一個印象(來自對原始問題的評論),您可以執行更新,但該更改沒有持續存在於數據庫中。這是常見的解決方案。它可能是其中的任何一種,可能就是其中之一。答案取決於您用於更新的方法。

  • 如果你通過鍵盤在一個數據窗口改變了列值,或比DataWindow控件或標籤進行AcceptText出列,以確保該列值被接受進入緩衝區更新的setText。 IE:dw_1.AcceptText()
  • 如果你已經完成了一個接受文本(沒有錯誤),然後像dw_1.Update()一樣執行數據窗口更新,並確保返回代碼是好的。
  • 邏輯事務完成後,運行嵌入式SQL語句:COMMIT;在dbms中提交更改。
  • 如果您通過嵌入式SQL進行更新,請確保您始終在命令後檢查SQLCA.SQLCODE。它應該是零,或者100沒有找到,對於錯誤是不利的。
  • 如果您從datawindow進行更新,數據窗口是否標記爲「可更新」?編輯數據窗口時需要使用行 - >更新屬性...
+0

謝謝。我一直在嘗試SetItem方法而不是嵌入式SQL,但在閱讀時,遇到了困難,導致DB中的更改持續存在。您的第一個4點被檢出,然後到達'更新屬性'中的最後一個,並注意到一些缺失的位:沒有選擇可更新的列,沒有設置標識列(雖然選擇了唯一的鍵列)。我修復了這兩個項目,並且...... PowerBuilder在dw.Update()調用中凍結了。看起來我已經回到原點了。 :( – voon

+0

我想到了一些你可以檢查的東西,一個是,你在數據窗口中有一個where子句,並且你是否使用正確的標準指定了更新屬性,以便它能找到唯一的行?我假設是 - 所以現在我建議將日誌記錄到位,並確定它是否在「Update」語句中崩潰。您正在使用哪種數據庫驅動程序?是否可以從開發模式更新數據窗口,也許可以嘗試?如果你陷入困境,並希望更多的想法打我 - 我最近有點想念PB故障排除。哦,是的,DB觸發器呢?他們可能會導致更新的破壞。 –

1

什麼樣的數據類型是COMMENTS表中的列comment_text?你期望支持多少個角色?

如果您正在從PowerBuilder嵌入式SQL更新大型文本或二進制數據,則使用UPDATEBLOB語句執行此操作。

Blob lBlob 
bBlob = Blob(var_containing_large_string) 
UPDATEBLOB COMMENTS 
SET comment_text = :lBlob 
WHERE ID = :lngID 
USING trans_object ; 

請檢查設置BinTxtBlob的文件,並在SELECTBLOB和UPDATEBLOB聲明: http://infocenter.sybase.com 該文檔是令人困惑,因爲它規定列必須是類型的「斑點」,但是這包括文本數據類型(可以從BinTxtBlob設置的文檔中看到)。

+0

該列是_long nvarchar_。 我設計的評論是無限的,但實際上200字左右已經足夠了。 感謝您的建議,我會嘗試UPDATEBLOB或將列更改爲常規長度nvarchar類型。 – voon

+0

ASA long varchar對應於PowerScript BLOB類型,如此處所述,例如: http://www.sybase.ca/detail?id=44008 像這樣的數據庫類型不由數據窗口或標準嵌入SQL功能。如果您不需要支持長文本,請更改列數據類型。否則,您將需要使用SELECTBLOB和UPDATEBLOB。 – WizzleWuzzle

+0

所以我終於用nvarchar(200)來測試這個...仍然沒有去。不管怎麼說,多謝拉。 – voon