Я пытаюсь выполнить хранимую процедуру в Entity Framework, которая получает вход (строку) и вывод (ref_cursor):
public virtual List<UserCost> GET_USER_CUSTO(string p_ANOMES)
{
var p_ANOMESParameter = new OracleParameter("P_ANOMES", OracleDbType.Varchar2, p_ANOMES, ParameterDirection.Input);
var p_refCursor = new OracleParameter("USER_CUSTO", OracleDbType.RefCursor, ParameterDirection.Output);
return this.Database.SqlQuery<UserCost>(
"BEGIN TIM_FUNCTIONS.GET_TIM_USER_CUSTO(:P_ANOMES, :USER_CUSTO); end;", p_ANOMESParameter, p_refCursor).ToList();
}
Но я получаю это исключение:
ORA-03111: разрыв, полученный по каналу связи
Я читал, что это может быть проблемой с версиями DB/dll, но я уже сделал то же самое с двумя другими хранимыми процедурами, и все работает нормально. Поэтому я думаю, что это не так.
Этот вопрос был задан на форуме Oracle с некоторыми полезными ответами, но без решения: https://community.oracle.com/thread/3967933
На самом деле я думаю, что он не связан с инфраструктурой сущности и, вероятно, не связан с провайдером инфраструктуры сущностей, но связан с провайдером Ado.Net.
Вы можете начать пытаться понять, работает ли одна и та же хранимая процедура без EF.
Я имею в виду, что вы можете запускать хранимую процедуру с помощью ado.net и, что очень важно, читать все данные (например, Console.Writeline каждый столбец или, похоже, заполнять данные, но в этом случае, если поставщик Oracle/Ado.Net зависает на определенной записи, вы ее не увидите).
У меня была та же проблема, с которой вы столкнулись, и мне кажется, что проблема связана с моей сетью не с инфраструктурой сущности. Высказывая статью, которая мне очень помогла, он попросил выполнить 4 шага:
- Сначала убедитесь, что ваш запрос может быть выполнен в течение указанного вами таймаута. Если вы постоянно сталкиваетесь с этим исключением, попробуйте увеличить время ожидания.
- Это может помочь избавиться от исключения, но не от основной причины. Основной причиной обычно является база данных, которая не оптимизирована для выполняемого запроса или плохой сети.
- Чтобы узнать, является ли проблема с базой данных, попробуйте выполнить тот же запрос на узле, который ближе к сети. Или попробуйте выполнить тот же запрос, который попадает в базу данных из другой сети. Если вы уверены, что проблема с базой данных, попробуйте настроить ее.
- Чтобы узнать, есть ли у этой сети проблема, попробуйте сделать tcpdump и проанализировать, есть ли какой-либо порядок доставки пакетов. Или упали пакеты. Если да, попробуйте исправить сеть.