Попытка чтения или записи защищенной памяти в Oracle 11g с помощью ODP.NET - PullRequest
11 голосов
/ 01 июля 2011

Я занимаюсь разработкой приложения, которое должно работать в течение длительных периодов времени и активно использовать базу данных Oracle (11g) через ODP.NET.

Однако иногда случается, что (каждый2 или 3 дня) ODP.NET создает исключение System.AccessViolationException, а затем необходимо перезапустить приложение.Вот моя трассировка стека:

Unhandled exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. 
---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at Oracle.DataAccess.Client.OpsSql.Prepare2(IntPtr opsConCtx, IntPtr& opsErrCtx, IntPtr& opsSqlCtx, IntPtr& opsDacCtx, OpoSqlValCtx*& pOpoSqlValCtx, string pCommandText, IntPtr& pUTF8CommandText, OpoMetValCtx*& pOpoMetValCtx, Int32 prmCnt)
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonquery()

Остальная часть трассировки стека время от времени отличается и относится к внутренним вызовам из моего приложения.

Теперь я сделал честныйКоличество исследований, прежде чем спрашивать здесь, но я не нашел ничего убедительного.Ряд других людей, очевидно, испытывают ту же проблему, хотя коренные причины, по-видимому, сильно различаются.Я действительно надеюсь, что у кого-то есть решение для этого: -)

На несвязанной ноте кажется, что это исключение способно игнорировать мои блоки catch {} и приводить к сбою приложения при каждом его возникновении.Это потому, что это связано с проблемами повреждения памяти?

С уважением, Андреа

редактировать: дальнейшее расследование привело меня к мысли, что стоит запустить службу «Координатор распределенных транзакций» и посмотреть,исключение перестает быть брошенным.Что ты думаешь?

Ответы [ 3 ]

7 голосов
/ 23 августа 2011

Это ошибка. Поставщики 11.1 и 11.2 имели эту проблему. Единственный способ обойти это - установить клиент 11.2.0.2, а затем применить исправление 6.

5 голосов
/ 17 ноября 2011

При создании объекта OracleCommand и добавлении параметров ...

я обнаружил, что при изменении:

select.Parameters.Add("Result", OracleDbType.RefCursor);

На:

select.Parameters.Add("Result", OracleDbType.RefCursor, ParameterDirection.Output);

Устранена эта проблема дляя на клиенте 11.2.0.2.

2 голосов
/ 13 апреля 2016

Мы столкнулись с тем же AccessViolationException, поскольку RefCursor был объявлен как параметр input вместо Output .

command.Parameters.Add("O_RECS", OracleDbType.RefCursor, null, ParameterDirection.Input);

Это грубое сообщение о такой простой ошибке. Изменение направления параметра исправило ошибку.

command.Parameters.Add("O_RECS", OracleDbType.RefCursor, null, ParameterDirection.Output);
...