VB.NETの更新Oracle Record ExecutENONQUERY問題
-
27-10-2019 - |
質問
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をブロックしないようにすることです...またはクエリがより速く実行されるように最適化します。