VB.net обновляет проблему записи Oracle ExecuteNonQuery - PullRequest
0 голосов
/ 17 марта 2011

Привет всем, когда я использую 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, так как он отлично работает в TOAD при выполнении того же запроса?

Спасибо!

Дэвид

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Вы также можете отключить исключение 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;

doобратите внимание, что вам понадобится возможность увидеть dba_objects, а также v $ locked_object (вытащил это из здесь )

и проверить эту статью http://www.orafaq.com/node/854

1 голос
/ 17 марта 2011

Похоже, что выполнение запроса занимает очень много времени, поэтому пользовательский интерфейс блокируется.Лучшим решением было бы запустить этот запрос в другом потоке, чтобы он не блокировал пользовательский интерфейс ... или не оптимизировал ваш запрос, чтобы он выполнялся быстрее.

...