0

大家好,当我使用 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 在 60 秒内无法从 COM 上下文 0x3327fa8 转换到 COM 上下文 0x3328118。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。

我该怎么做才能让它在 VB.net 中工作,因为它在运行相同的查询时在 TOAD 中工作得很好?

谢谢!

大卫

4

2 回答 2

1

看起来查询需要很长时间才能执行,因此 UI 处于阻塞状态。最好的解决方案是在不同的线程中运行这个查询,这样它就不会阻塞用户界面……或者优化你的查询,让它运行得更快。

于 2011-03-17T18:31:28.833 回答
1

您还可以关闭检测到 ContextSwitchDeadlock 异常:

要避免出现这些错误弹出窗口,请从 Visual Studio 窗口的“调试”菜单中选择“异常”,然后在“异常对话框”中选择“托管调试助手异常节点”。然后选择 ContextSwitchDeadlock 并从 Thrown 列中删除选择

来自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(从这里拉出)

并查看这篇文章 http://www.orafaq.com/node/854

于 2011-03-17T19:26:11.073 回答