我还没有在任何地方找到明确说明,但我在网上发现的一些例子都遵循我一直在做的事情。
我有一个C#类,它使用ODP.net连接到Oracle DB并运行包中的过程。
我的包有存储过程,它接受引用游标输出参数。所有程序都打开了特定select语句的光标。
如果我直接在oracle db上执行此过程,那么最终我会遇到最大数量的打开游标错误。
所以我想知道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)方法在执行Fill()方法后释放了引用游标。
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html
我希望Oracle文档在描述这个过程时更明确。
答案 0 :(得分:9)
ODP.NET要求你清理东西。所以你:
I.o.w。:清理你创造的东西。
可能是OracleDataAdapter已经为你做了这个,但是目前还不清楚(并且odp.net文档没有这么说,所以你要用反射器检查(不可读)代码以确保。虽然规则拇指与odp.net:为了避免内存泄漏,总是在命令的所有内容上调用dispose:参数,游标,命令,事务,连接。
答案 1 :(得分:0)
我不确定你是否偶然发现了this文章,它并不直接适用于您的问题,但它说明了我在使用ODP.Net时学到的东西:当有疑问时,总是关闭(连接)并处置。我编写的每个使用ODP连接,命令和/或游标实例的方法都有一个finally子句来处理所有内容。