Я пока не смог найти это явно где-либо заявлено, но множество примеров, которые я нашел в Интернете, следуют за тем, что я делал.
У меня есть класс C#, который использует ODP.net для подключения к базе данных Oracle и запуска процедуры в пакете.
В моем пакете есть хранимые процедуры, которые принимают выходной параметр курсора ref. Все, что делает процедура, - это открывает курсор для определенного оператора выбора.
Если я выполню эту процедуру непосредственно в базе данных oracle, то в конечном итоге я обнаружу ошибку максимального количества открытых курсоров.
Поэтому мне было интересно, действительно ли ODP.net закрывает этот курсор, который был открыт в моей процедуре?
Я использую метод OracleDataApaper.Fill (DataSet).
например.
DataSet ds = new DataSet();
OracleConnection conn = new OracleConnection(this.connStr);
OracleCommand com = new OracleCommand("MYPKG.MYQUERY", conn);
OracleDataAdapter adapter = new OracleDataAdapter(com);
conn.Open();
com.Parameters.Add("searchParam", OracleDbType.Varchar2).Value = "myName";
com.Parameters.Add("outCursor", OracleDbType.RefCursor, ParameterDirection.Output);
com.CommandType = CommandType.StoredProcedure;
adapter.Fill(ds);
conn.Close();
PROCEDURE GETALLEMAILS(searchParamIN VARCHAR2, outCursor OUT sys_refcursor) AS
BEGIN
open outCursor
select
EAEMAL as Email
from
EmailTable
where
EmailName = searchParam;
END GETALLEMAILS;
Я просто боюсь оставить открытые курсоры в БД, вот и все. Если бы кто-нибудь мог предоставить ссылки на официальную документацию, было бы здорово!
Обновления:
Спасибо за вклад. Я звонил
com.Dispose();
conn.Close();
conn.Dispose();
но оставил их вне моего примера.
Я нашел это сообщение на форуме, в котором говорится, что метод OracleDataAdapter.Fill (Dataset) действительно освобождает курсор ref после выполнения метода Fill ().
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html
Я бы хотел, чтобы документация Oracle более подробно описывала этот процесс.





Я не уверен, наткнулся ли вы на статью это, и она не относится непосредственно к вашему вопросу, но она иллюстрирует то, что я узнал при работе с ODP.Net: в случае сомнений всегда закрывайте (соединения) и удаляйте. Каждый метод, который я пишу, который использует экземпляр соединений ODP, команд и / или курсоров, имеет предложение finally, удаляющее все.
ODP.NET требует от вас наведения порядка. Так что вы:
I.o.w .: убирайте то, что вы создаете.
Возможно, OracleDataAdapter уже делает это за вас, но это неясно (и в документации odp.net об этом не говорится, поэтому вы должны проверить (нечитаемый) код с помощью отражателя, чтобы убедиться. Хотя практическое правило с odp .net: чтобы избежать утечки памяти, всегда вызывайте dispose для всего в порядке: параметр, курсор, команда, транзакция, соединение.
Я бы добавил OracleDataReader в список объектов для удаления, если вы их используете. Похоже, что решена наша проблема "максимальных открытых курсоров".