質問

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内でこれを機能させるために何ができますか?

ありがとう!

デビッド

役に立ちましたか?

解決

また、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を見る能力が必要になることに注意してください(これを引いた ここ)

この記事をご覧くださいhttp://www.orafaq.com/node/854

他のヒント

クエリの実行に非常に長い時間がかかるように見えるため、UIはブロックしています。最良の解決策は、このクエリを別のスレッドで実行して、UIをブロックしないようにすることです...またはクエリがより速く実行されるように最適化します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top