Oracle & .net С#

  • Автор темы Real-Mulik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Real-Mulik

#1
Вознкла следующая проблема. В БД Oracle содержется хранимая процедура с 4-мя input параметрами. Необходимо ее выпонить передав ей параметры. Если все делать "руками" т.е. формировать запрос следующим образом:
Код:
OracleConnection con = new OracleConnection("Data Source=colg;Persist Security Info=True;User ID=mail;Unicode=True");
con.Open();
OracleCommand cmd = new OracleCommand("MAIL.UPDATEORDELETEPARAMETRS('timeout',1,'300',null)", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
то все работате. Однако хотелось бы все сделать по-взрослому, т.е. с использованием параметров. Поэтому была предпринята попытка сделать следующее:
Код:
OracleConnection con = new OracleConnection("Data Source=colg;Persist Security Info=True;User ID=mail;Unicode=True");
OracleCommand cmd = new OracleCommand("MAIL.UPDATEORDELETEPARAMETRS", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
con.Open();
cmd.Parameters.Add("NAMEPARAMETR",OracleType.VarChar);
cmd.Parameters.Add("ID_MAILBOX", OracleType.Number);
cmd.Parameters.Add("VALUEP", OracleType.VarChar);
cmd.Parameters.Add("COMMENTP", OracleType.VarChar);
cmd.Parameters[0].Direction = System.Data.ParameterDirection.Input;
cmd.Parameters[0].Value = "timeout";
cmd.Parameters[1].Direction = System.Data.ParameterDirection.Input;
cmd.Parameters[1].Value = "1";
cmd.Parameters[2].Direction = System.Data.ParameterDirection.Input;
cmd.Parameters[2].Value = "300";
cmd.Parameters[3].Direction = System.Data.ParameterDirection.Input;
cmd.Parameters[3].Value = null;
cmd.ExecuteNonQuery();
что повлекло след. ошибку:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'UPDATEORDELETEPARAMETR
S'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Интерпритация свойства CommandText типа:
Код:
OracleCommand cmd = new OracleCommand("MAIL.UPDATEORDELETEPARAMETRS(NAMEPARAMETR,ID_MAILBOX,VALUEP, COMMENTP)", con);
приводит к след ошибке:
ORA-06550: line 1, column 7:
PLS-00801: internal error [22503]
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Если параметры заменить на знаки ? выдается сообщение:
Internal .Net Framework Data Provider error 30.
Как еще можно вызвать хранимую процедуру?
 
R

Real-Mulik

#2
Код:
DataSetOptions.MP_MAILCFGDataTable MP_MAILCFG = new DataSetOptions.MP_MAILCFGDataTable();
OracleConnection con = new OracleConnection("Data Source=colg;Persist Security Info=True;User ID=mail;Password=mail;Unicode=True");
OracleCommand cmd = new OracleCommand("MAIL.UPDATEORDELETEPARAMETRS", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
con.Open();
cmd.Parameters.Add("NAMEPARAMETR",OracleType.VarChar,50);
cmd.Parameters.Add("ID_MAILBOX", OracleType.Int32);
cmd.Parameters.Add("VALUEP", OracleType.VarChar,50);
cmd.Parameters.Add("COMMENTP", OracleType.VarChar,100);
cmd.Parameters[0].Direction = System.Data.ParameterDirection.Input;
cmd.Parameters[0].Value = "timeout";
cmd.Parameters[1].Direction = System.Data.ParameterDirection.Input;
cmd.Parameters[1].Value = "1";
cmd.Parameters[2].Direction = System.Data.ParameterDirection.Input;
cmd.Parameters[2].Value = "300";
cmd.Parameters[3].Direction = System.Data.ParameterDirection.Input;
cmd.Parameters[3].Value = DBNull.Value;
cmd.ExecuteNonQuery();
Такая же ошибка :). Причем были так же заменены VarChar на NVarChar .. тоже самое...
 
R

Real-Mulik

#3
Вот заголовок:
Код:
CREATE OR REPLACE PROCEDURE updateordeleteparametrs (
v_nameparametr  mp_mailcfg.nameparametr%TYPE,
v_id_mailbox	 mp_mailcfg.id_mailbox%TYPE,
v_valuep		 mp_mailcfg.valuep%TYPE,
v_commentp	  mp_mailcfg.commentp%TYPE
)
IS
А вот на сервер что приходит - найти не удалось. ни один профайле запрос показывать не хочет
 
R

Real-Mulik

#5
поправил:
Код:
CREATE OR REPLACE PROCEDURE updateordeleteparametrs (
v_nameparametr  IN  VARCHAR DEFAULT 'timeout',
v_id_mailbox	 IN  NUMBER DEFAULT 1,
v_valuep		 IN  VARCHAR DEFAULT '1000',
v_commentp	  IN  VARCHAR := '1000'
)
Код:
OracleCommand cmd = new OracleCommand("MAIL.UPDATEORDELETEPARAMETRS", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
con.Open();
OracleParameter Param1 = new OracleParameter("v_nameparametr", OracleType.VarChar, 50, "NAMEPARAMETR");
Param1.Direction = System.Data.ParameterDirection.Input;
Param1.Value = "timeout";
OracleParameter Param2 = new OracleParameter("v_id_mailbox", OracleType.Number, 22, "ID_MAILBOX");
Param1.Direction = System.Data.ParameterDirection.Input;
Param1.Value = 1;
OracleParameter Param3 = new OracleParameter("v_valuep", OracleType.VarChar, 50, "VALUEP");
Param1.Direction = System.Data.ParameterDirection.Input;
Param1.Value = "300";
OracleParameter Param4 = new OracleParameter("v_commentp", OracleType.VarChar, 50, "COMMENTP");
Param1.Direction = System.Data.ParameterDirection.Input;
Param1.Value = "ggg";
Процедура начала отрабатывать, но со значениями DEFAULT.
 
R

Real-Mulik

#6
Все получилось!
<!--QuoteBegin-Real-Mulik+13:03:2007, 12:58 -->
<span class="vbquote">(Real-Mulik @ 13:03:2007, 12:58 )</span><!--QuoteEBegin-->Имена (можно без учета case-sensitive) параметров и их типы (с атрибутами) должны соответствовать, как в процедуре так и те что прописывают в объект комманда.
[snapback]58904" rel="nofollow" target="_blank[/snapback]​
[/quote]
это замечание является ключевым.
<!--QuoteBegin-sax_ol+13:03:2007, 10:14 -->
<span class="vbquote">(sax_ol @ 13:03:2007, 10:14 )</span><!--QuoteEBegin-->cmd.Parameters[3].Value = null; тут null пробуте поменять на DBNull.Value
[snapback]58873" rel="nofollow" target="_blank[/snapback]​
[/quote]
да.. с null не работает
в пердыдущем коде была ошибка .. вот код который 100% работает:
Код:
--Заголовок процедуры
CREATE OR REPLACE PROCEDURE updateordeleteparametrs (
v_nameparametr  IN  mp_mailcfg.nameparametr%TYPE,
v_id_mailbox	 IN  mp_mailcfg.id_mailbox%TYPE,
v_valuep		 IN  mp_mailcfg.valuep%TYPE,
v_commentp	  IN  mp_mailcfg.commentp%TYPE
)
И код запуска процедуры:
Код:
OracleCommand cmd = new OracleCommand("MAIL.UPDATEORDELETEPARAMETRS", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
con.Open();
OracleParameter Param1 = new OracleParameter("v_nameparametr", OracleType.VarChar);
Param1.Direction = System.Data.ParameterDirection.Input;
Param1.Value = "timeout";
OracleParameter Param2 = new OracleParameter("v_id_mailbox", OracleType.Number);
Param2.Direction = System.Data.ParameterDirection.Input;
Param2.Value = 1;
OracleParameter Param3 = new OracleParameter("v_valuep", OracleType.VarChar);
Param3.Direction = System.Data.ParameterDirection.Input;
Param3.Value = "300";
OracleParameter Param4 = new OracleParameter("v_commentp", OracleType.VarChar);
Param4.Direction = System.Data.ParameterDirection.Input;
Param4.Value = DBNull.Value;
cmd.Parameters.Add(Param1);
cmd.Parameters.Add(Param2);
cmd.Parameters.Add(Param3);
cmd.Parameters.Add(Param4);
cmd.ExecuteNonQuery();
Всем спасибо!
 
Статус
Закрыто для дальнейших ответов.