2015-04-03 38 views
-1

我有以下更新語句,其在SQL Developer中工作正常:現在增量列的值 - (ORA-01013)

UPDATE SDUSERS SET PWDATTEMPTS=PWDATTEMPTS+1 WHERE lower(UserName)='test'; 

,在我的VB.NET它不更新數據庫由於某種原因,它產生錯誤ORA-01013:用戶請求取消當前操作,錯誤代碼:2147467259

Dim sqlUpdateFailed As New OracleCommand("UPDATE " & oConnection.SCHEMA_NAME.ToUpper 
& "SDUSERS SET PWDATTEMPTS=PWDATTEMPTS+1 WHERE lower(USERNAME)='" & sUsername & "'", conn) 
       sqlUpdateFailed.CommandTimeout = 20 
       sqlUpdateFailed.ExecuteNonQuery() 

任何想法我可能是做錯了?

+0

您忘記了DB名稱和表名之間的「。」。 – 2015-04-03 10:06:23

+0

@juergend是的,這是很好,因爲它已經與點已經 – alwaysVBNET 2015-04-03 10:08:17

回答

0

很可能,ORA-1013在你的情況下的原因是達到了查詢執行超時。檢查它,嘗試一些很大的超時值。

這樣的更新應該執行得很快,速度非常快(我猜表格很小,不是嗎?)所以如果掛起它意味着記錄被鎖定。也許你更新了這個記錄到SQL Developer中,忘記了提交,也許還有別的。您可以在更新聲明前執行SELECT * FROM SDUSERS WHERE lower(UserName) = :username FOR UPDATE NOWAIT之類的檢查。

順便說一句,你的來源給了SQL Injection一個很好的能力。

+0

執行你的建議查詢後,我得到了一個ORA-00054:資源忙,並獲取與NOWAIT指定或超時過期。有關如何繼續的建議?我的程序在本地運行,所以我不相信我會有SQL注入攻擊,但無論如何,你會建議將它改爲? – alwaysVBNET 2015-04-03 11:31:41

+0

我所做的是使用值更新表,手動提交來自SQL Developer的更改,然後重新運行該程序。來自應用程序的連接需要關閉才能查看錶中的更新。如果您可以詳細說明如何更改查詢,那就太棒了。 – alwaysVBNET 2015-04-03 11:59:25

+0

所以你應該找到誰持有鎖。我建議你從'select * from dba_dml_locks'開始,其中name ='SDUSERS'。但通常情況下,您應該檢查所有的SDUSERS操作或在Oracle本身顯示一些專業知識。 – 2015-04-03 12:08:05