如何执行oracle存储过程使用c#返回多个游标

时间:2014-03-17 10:03:37

标签: c# oracle plsql cursor

我在C#中使用OracleClient。 我有一个存储过程返回多个游标。 我必须将每个游标关联到不同的表。 但当它试图这样做时,我收到了这个错误。

ORA-24338: statement handle not executed

有人可以帮我纠正这个问题。

2 个答案:

答案 0 :(得分:0)

OracleClientSystem.Data.OracleClient?它已被弃用。不要使用它。

尝试使用Oracle提供的托管.NET ODP,在此处找到(ODAC 12c及更高版本是100%托管代码):http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.html

如果这对您没有帮助,请尝试发布更多信息,例如数据库版本,连接器版本等。

答案 1 :(得分:0)

我目前已经实现了这样的代码。所以,让我给你我遵循的步骤。

  1. 在DAC层中,我安排了输入参数并输出 存储过程的参数(RefCursors)。

     using (DbCommand objCmd = dbObject.GetSqlStringCommand(queryString))
        {
        ...
        objCmd.Parameters.Add("Ref_CursorName1",OracleDbType.RefCursor,ParameterDirection.Output);
        objCmd.Parameters.Add("Ref_CursorName2",OracleDbType.RefCursor,ParameterDirection.Output);
         ...
        connectoinObj.Open();
        objCmd.ExecuteNonQuery();
    
  2. 遍历参数计数。

    for (int i = 0; i < objcmd.Parameters.Count; i++)
        { 
         if(objcmd.Parameters[i].DbType == DbType.Object)
           {
             if(!(OracleRefCursor) objCmd.Parameters[i].Value).IsNull)
                {
                  var cursorParam = ((OracleRefCursor) objCmd.Parameters[i].Value).GetDataReader();
               if(cursorParam.HasRows && cursorParam.FieldCount > 0)
                  {
                    MapCursors(cursorParam, objcmd.Parameters[i].ParameterName, response); //type of your response object.                          
                  }
                }
            }
          }
    
  3. 最后一步是MapCursors方法的实现。

    private void MapCursors(OracleDataReader cursorParam, string parameterName, ClassName response)
       {
          case "Ref_CursorName1":
               RetriveDataFromRef_CursorName1(cursorParam, response);
               break; 
       }
    
  4. 将光标数据映射到对象(响应)。