当前位置:  开发笔记 > 编程语言 > 正文

ODP.net在连接关闭时是否关闭引用游标?

如何解决《ODP.net在连接关闭时是否关闭引用游标?》经验,为你挑选了1个好方法。

我还没有在任何地方找到明确说明的内容,但我在网上找到的一些例子都遵循我一直在做的事情.

我有一个C#类,它使用ODP.net连接到Oracle DB并运行一个包中的过程.

我的包有存储过程,它接受ref游标输出参数.所有过程都打开了特定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文档在描述此过程时更加明确.



1> Frans Bouma..:

ODP.NET要求你清理东西.那么你:

必须处置OracleParameter实例,因为它们包含非托管资源(!)而Odp.net不会这样做

必须处置OracleCommand对象,因为它们也包含非托管资源,关闭连接不会关闭它们

打开游标无法在没有打开连接的情况下生存,但在odp.net中,在连接关闭(或被处理)后没有任何东西被清除,所以你也必须清理它们(当然连接关闭之前).

喵:清理你创造的东西.

可能是OracleDataAdapter已经为你做了这个,但是目前还不清楚(并且odp.net文档没有说明这一点,所以你要用反射器检查(不可读)代码以确保.虽然经验法则有odp .net:为了避免内存泄漏,总是在命令的所有内容上调用dispose:参数,游标,命令,事务,连接.


如果你使用它,我会将OracleDataReader添加到要处理的对象列表中.它似乎已经解决了我们的"最大开放游标"问题.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有