【问题标题】:Using ouput parameter of type SYS_refcursor使用 SYS_refcursor 类型的输出参数
【发布时间】:2011-10-12 10:40:25
【问题描述】:

在我的数据库中,我有一个带有 SYS_REFCURSOR 类型的 OUTPUT 参数的存储过程。应用程序端是用 C# 编写的。我可以将此过程的输出参数分配给 Datatable,例如:

 .............
 OracleConnection con=new OracleConnection(......);
 OracleCommand cmd=new OracleCommand("MyStoredProc",con);
 cmd.CommandType=CommandType.StoredProcedure;
 cmd.Parameters.Add("REC_CUR",OracleType.Cursor).Direction=ParameterDirection.Output;
 con.Open();
 cmd.ExecuteNonQuery();
 DataTable dt=(DataTable)cmd.Parameters["REC_CUR"].value;//is this legal?

【问题讨论】:

    标签: c# stored-procedures oracle10g out-parameters sys-refcursor


    【解决方案1】:

    这是我自己问题的答案。如果存储过程的输出参数是 SYS_REFCURSOR 类型,那么命令

    cmd.Parameters["REC_CUR"].value
    

    将返回一个 OracleDataReader 对象,而不是一个表。并且没有从 OracledataReader 到 DataTable 的隐式或显式转换。

    【讨论】:

    • 应该提到的是,没有从任何 DataReader 到 DataTable 的隐式转换(不仅仅是 OracleDataReader)。可以改用DataTable.Load (IDataReader) 方法。例如DataTable dt = new DataTable(); dt.Load((OracleDataReader)cmd.Parameters["REF_CUR"].value);
    • 确保在完成读取数据或将其加载到 DataTable 之前不要关闭连接对象。如果您在调用 DataTable.Load 时关闭 DataReader,则不会引发异常。
    【解决方案2】:

    你可以像下面这样使用OracleDataAdapter

    带有多个输出参数的示例代码RefCursor

    using (OracleCommand cmd = new OracleCommand("SP1", OraCon) { CommandType = System.Data.CommandType.StoredProcedure })
    {
        var parm_nic = cmd.Parameters.Add("parm_nic", OracleDbType.NVarchar2);
        parm_nic.Value = msgBody;
    
        var pram_Name = cmd.Parameters.Add("pram_Name", OracleDbType.NVarchar2, 150, ParameterDirection.Output);
        var pram_PAdress = cmd.Parameters.Add("pram_PAdress", OracleDbType.NVarchar2, 150, ParameterDirection.Output);
        var output = cmd.Parameters.Add("pram_status", OracleDbType.RefCursor, ParameterDirection.Output);
        OraCon.Open();
    
        OracleDataAdapter ad = new OracleDataAdapter(cmd);
        OracleCommandBuilder cb = new OracleCommandBuilder(ad);
    
        DataTable dt = new DataTable();
        ad.Fill(dt);
    
        var address = pram_PAdress.Value;
        var name = pram_Name.Value;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 2013-09-02
      • 2021-10-23
      • 2020-03-07
      • 2012-08-14
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多