VB.net更新Oracle记录ExecuteNonQuery问题

时间:2011-03-17 18:25:04

标签: vb.net oracle oracle10g sql-update executenonquery

嘿所有当我使用TOAD更新表时,使用此查询时一切正常:

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.net程序中执行相同的操作:

 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中运行得很好?

谢谢!

大卫

2 个答案:

答案 0 :(得分:1)

看起来查询需要很长时间才能执行,因此UI会阻塞。最好的解决方案是在不同的线程中运行此查询,以便它不会阻止UI ...或优化您的查询以便它运行得更快。

答案 1 :(得分: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