#c# #stored-procedures #oracle10g #out-parameters #sys-refcursor
#c# #хранимые процедуры #oracle10g #out-параметры #sys-refcursor
Вопрос:
В моей базе данных у меня есть хранимая процедура с выходным параметром типа SYS_REFCURSOR. Сторона приложения написана на 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?
Ответ №1:
Вот ответ на мой собственный вопрос. Если выходной параметр хранимой процедуры имеет тип SYS_REFCURSOR, то команда
cmd.Parameters["REC_CUR"].value
вернет объект OracleDataReader, а не таблицу. И нет ни неявного, ни явного приведения из OracleDataReader в DataTable .
Комментарии:
1. Следует отметить, что нет неявного приведения из любого DataReader в DataTable (не только OracleDataReader).
DataTable.Load (IDataReader)
Вместо этого можно использовать метод. напримерDataTable dt = new DataTable(); dt.Load((OracleDataReader)cmd.Parameters["REF_CUR"].value);
2. Убедитесь, что вы не закрываете объект подключения, пока не закончите чтение данных или загрузку их в DataTable. Исключение не выдается, если ваш DataReader закрыт при вызове DataTable.Load .
Ответ №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;
}