gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:35:30 25 4
gpt4 key购买 nike

我还没有在任何地方找到明确说明这一点,但我在网上找到的一堆例子都符合我一直在做的事情。

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

我的包有存储过程,它带有一个 ref cursor 输出参数。该过程所做的只是为特定的选择语句打开游标。

如果我直接在 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) 方法在执行 Fill() 方法后确实释放了引用光标。
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html

不过,我希望 Oracle 文档更明确地描述这个过程。

最佳答案

ODP.NET 要求您清理一些东西。所以你:

  • 必须处置 OracleParameter 实例,因为它们包含非托管资源 (!) 而 Odp.net 不会这样做
  • 必须处理 OracleCommand 对象,因为它们也包含非托管资源并且关闭连接不会关闭这些资源
  • 打开的游标不能在没有打开的连接的情况下存在,尽管在 odp.net 中连接关闭(或被处置)后没有任何东西被清理,所以你也必须清理这些(当然是在连接关闭之前) .

I.o.w.:清理你创造的东西。

它可能是 OracleDataAdapter 已经为你做了这件事,但这还不清楚(而且 odp.net 文档没有这样说,所以你必须用反射器检查(不可读的)代码以确保。虽然规则odp.net 经验:为避免内存泄漏,始终按以下顺序对所有内容调用处置:参数、游标、命令、事务、连接。

关于c# - ODP.net 是否在连接关闭时关闭引用游标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/358135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com