2011-03-17 101 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