2011-03-17 91 views
0

嘿當我使用蟾蜍更新表中所有使用該查詢時工作得很好:VB.net更新甲骨文記錄的ExecuteNonQuery問題

Update CSR.CSR_EAI_SOURCE ces 
     Set (STATUS_CODE, COMPLETE_DATE, DATA) = 
      (SELECT 'ERROR', '', REPLACE(REPLACE(c.Data, '…', ' '), '’','''') 
      FROM CSR.CSR_EAI_SOURCE C 
      WHERE c.EID = ces.EID 
       AND c.STATUS_CODE = 'ERROR') 
     WHERE EXISTS (SELECT 1 
         FROM CSR.CSR_EAI_SOURCE C 
         WHERE c.EID = ces.EID 
         AND c.STATUS_CODE = 'ERROR'); 

但是,一旦我嘗試做同樣的事情在我的VB。使用此代碼網方案:

Dim OracleCommand As New OracleCommand() 
Dim ra As Integer 

OracleCommand = New OracleCommand("UPDATE CSR.CSR_EAI_SOURCE ces " & _ 
             "SET  (STATUS_CODE, COMPLETE_DATE, DATA) = " & _ 
               "(SELECT 'ERROR', '', REPLACE(REPLACE(c.Data, '…', ' '), '’','''') " & _ 
               "FROM  CSR.CSR_EAI_SOURCE C " & _ 
               "WHERE  (c.EID = ces.EID) " & _ 
               "AND  c.STATUS_CODE = 'ERROR') " & _ 
             "WHERE EXISTS (SELECT 1 " & _ 
             "FROM  CSR.CSR_EAI_SOURCE C " & _ 
             "WHERE (c.EID = ces.EID) " & _ 
             "AND  c.STATUS_CODE = 'ERROR')", OracleConnection) 

    Try 
     ra = OracleCommand.ExecuteNonQuery() 
     OracleConnection.Close() 
     MsgBox("done") 
    Catch ex As Exception 
     MsgBox("ERROR: " & Err.Description & " " & Err.Number) 
     OracleConnection.Close() 
    End Try 

它停留在RA = OracleCommand.ExecuteNonQuery()不斷,直到我得到的錯誤

CLR無法從COM上下文0x3327fa8轉換到COM上下文0x3328118 60秒。擁有目的地上下文/公寓的線程很可能要麼進行非抽水等待,要麼處理非常長的運行操作而不抽取Windows消息。這種情況通常會對性能產生負面影響,甚至可能導致應用程序無法響應或內存使用量不斷累積。爲了避免這個問題,所有的單線程單元(STA)線程都應該使用抽取等待原語(比如CoWaitForMultipleHandles),並在長時間運行的操作中定期抽取消息。

我能做些什麼才能在VB.net中正常工作,因爲它在TOAD運行相同的查詢時工作得很好?

謝謝!

David

+0

當您在TOAD中運行查詢時,是否需要很長時間才能執行? – 2011-03-17 19:30:31

回答

1

你也可以關閉ContextSwitchDeadlock檢測到異常:

爲了避免這些錯誤彈出窗口從 出現,從Visual Studio的窗口 並在異常對話框的 調試菜單中選擇例外選擇 管理調試助手 異常節點。然後選擇 ContextSwitchDeadlock和拋出該異常列

http://dotnetdud.blogspot.com/2009/01/clr-has-been-unable-to-transition-from.html

編輯刪除 選擇:檢查鎖

SELECT LPAD(' ',DECODE(l.xidusn,0,3,0)) || l.oracle_username "User Name", 
o.owner, o.object_name, o.object_type 
FROM v$locked_object l, dba_objects o 
WHERE l.object_id = o.object_id 
ORDER BY o.object_id, 1 desc; 

你注意,你需要能夠看到DBA_OBJECTS以及v $ locked_object(從here中取出)

並查看這篇文章 http://www.orafaq.com/node/854

+0

我已經嘗試關閉ContextSwitchDeadlock,它只是在那裏坐在那裏,在** ra = OracleCommand.ExecuteNonQuery()**行中不做任何事情。 – StealthRT 2011-03-17 20:00:39

+0

@StealthRT是否可以在桌上有一個鎖,它正在等待鎖被解決?嘗試在你的TOAD會話中提交,看看你是否打開了獨佔鎖; TOAD更新需要多長時間?無論您在何處發起查詢,結果都應該大致相同。 – Harrison 2011-03-17 20:05:13

+0

@哈里森:我將如何去檢查是否有鎖? – StealthRT 2011-03-17 20:10:37

1

看起來像查詢需要很長時間才能執行,所以UI被阻塞。最好的解決方案是在不同的線程中運行此查詢,以便它不會阻止UI ...或優化查詢以使其運行速度更快。

+0

好吧,我已經試圖把它放到後臺工作,但它有相同的效果..需要很長時間執行,並且從不做任何事情,但不顯示該錯誤,它不顯示任何內容,並繼續前進......我做了a ** ctrl + break **和** green arrow **仍然在** ra = OracleCommand.ExecuteNonQuery()**上。 – StealthRT 2011-03-17 19:59:58

+0

好吧,我會按照哈里森的建議,必須有一個鎖,防止查詢完成。 – 2011-03-17 20:19:28