Oracle & .net С#

Тема в разделе ".NET", создана пользователем Real-Mulik, 13 мар 2007.

Статус темы:
Закрыта.
  1. Real-Mulik

    Real-Mulik Гость

    Вознкла следующая проблема. В БД Oracle содержется хранимая процедура с 4-мя input параметрами. Необходимо ее выпонить передав ей параметры. Если все делать "руками" т.е. формировать запрос следующим образом:
    Код (Text):
    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();
    то все работате. Однако хотелось бы все сделать по-взрослому, т.е. с использованием параметров. Поэтому была предпринята попытка сделать следующее:
    Код (Text):
    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();
    что повлекло след. ошибку:
    Интерпритация свойства CommandText типа:
    Код (Text):
    OracleCommand cmd = new OracleCommand("MAIL.UPDATEORDELETEPARAMETRS(NAMEPARAMETR,ID_MAILBOX,VALUEP, COMMENTP)", con);
    приводит к след ошибке:
    Если параметры заменить на знаки ? выдается сообщение:
    Как еще можно вызвать хранимую процедуру?
     
  2. Real-Mulik

    Real-Mulik Гость

    Код (Text):
    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 .. тоже самое...
     
  3. Real-Mulik

    Real-Mulik Гость

    Вот заголовок:
    Код (Text):
    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
    А вот на сервер что приходит - найти не удалось. ни один профайле запрос показывать не хочет
     
  4. ????

    ???? Гость

    а поля таблицы какой тип имеют?
     
  5. Real-Mulik

    Real-Mulik Гость

    поправил:
    Код (Text):
    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'
    )
    Код (Text):
    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.
     
  6. Real-Mulik

    Real-Mulik Гость

    Все получилось!
    <!--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% работает:
    Код (Text):
    --Заголовок процедуры
    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
    )
    И код запуска процедуры:
    Код (Text):
    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();
    Всем спасибо!
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей