1

在我的数据库中,我有一个带有 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?
4

2 回答 2

2

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

cmd.Parameters["REC_CUR"].value

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

于 2011-10-14T07:02:41.137 回答
1

你可以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;
}
于 2014-03-04T07:37:33.903 回答