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 など) を使用し、実行時間の長い操作中に定期的にメッセージをポンピングする必要があります。

同じクエリを実行するとTOADで問題なく動作するため、VB.net内でこれを動作させるにはどうすればよいですか?

ありがとう!

デビッド

4

2 に答える 2

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 に答える
1

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

于 2011-03-17T18:31:28.833 に答える