我正在使用ODP.NET(从Microsoft的提供程序迁移),并且我遇到了一个返回refcursor的存储过程。我有以下PL / SQL过程(我已经改变了一点以使其更通用):
PROCEDURE MyProc(parameter_no1 IN NUMBER, parameter_no2 IN NUMBER, RETCURSOR OUT ret_type) AS
BEGIN
OPEN RETCURSOR FOR
SELECT ad.logo logo
FROM tab_a a, tab_h h
WHERE a.id IS NOT NULL
AND a.h_id = h.id
AND a.no1 = parameter_no1
AND a.no2= parameter_no2;
END HanteraLogotype;
然后我有下面的C#代码来调用它:
internal void RefCursorDataReader()
{
OracleCommand cmd = new OracleCommand("ABC$MYPACKAGE.MyProc", new OracleConnection(_constr));
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection.Open();
cmd.BindByName = true;
OracleParameter p = cmd.Parameters.Add("parameter_no1", OracleDbType.Decimal);
p.Value = 12345678;
p.Direction = ParameterDirection.Input;
p = cmd.Parameters.Add("parameter_no2", OracleDbType.Decimal);
p.Value = 123456;
p.Direction = ParameterDirection.Input;
p = cmd.Parameters.Add("RETCURSOR", OracleDbType.RefCursor);
p.Direction = ParameterDirection.Output;
OracleDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
System.Diagnostics.Debug.WriteLine(reader[0].GetType().ToString());
}
cmd.Connection.Close();
}
当我运行这个时,我不断得到这个例外:
ORA-03106:致命的双任务通信协议错误
我已经尝试了许多不同的参数变体,它们的类型,顺序等,但似乎没有任何帮助。它是抛出异常的reader.Read()
。我非常感谢你对此的帮助!
添加了: ret_type定义为:
TYPE ret_type IS REF CURSOR;
答案 0 :(得分:1)
这看起来像个错误。 3106错误是一个永远不会发生的错误。我确定有一个解决方法!!
在OTN ODP.NET论坛上,提出ODP.NET问题的最佳地点已经结束。如果我是你,我会发布在那里:
http://forums.oracle.com/forums/forum.jspa?forumID=146&start=0
还搜索特定论坛的“3106”
答案 1 :(得分:0)
我升级到11G ODP.NET