0

我正在使用 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 定义为:

类型 ret_type 是参考光标;

4

2 回答 2

1

这看起来像一个错误。3106 错误是一个不应该发生的严重错误。我敢肯定有一个解决方法!

询问 ODP.NET 问题的最佳地点是 OTN ODP.NET 论坛。如果我是你,我会把这个贴在那里:

http://forums.oracle.com/forums/forum.jspa?forumID=146&start=0

还可以在该特定论坛中搜索“3106”

于 2009-07-31T19:30:58.800 回答
0

我升级到 11G ODP.NET

于 2009-08-11T20:41:01.427 回答