我还没有在任何地方找到明确的说明,但是我在网上找到的一堆例子遵循了我一直在做的事情。
我有一个 C# 类,它使用 ODP.net 连接到 Oracle DB 并运行包中的过程。
我的包有存储过程,它采用 ref 游标输出参数。该过程所做的只是为特定的选择语句打开游标。
如果我直接在 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 文档能更明确地描述这个过程。