2013-04-17 4 views
1

Я пытаюсь написать веб-службу, которая вызывает хранимую процедуру oracle. Процедура имеет 2 входа - строку (company_code) и int (код клиента). Он имеет 2 выходных параметра; число (pout_addr_code) и varchar2 (pout_descr). Когда я запускаю эту процедуру из SQL Developer, все работает отлично, и оба значения возвращаются, как и ожидалось. Когда я вызываю процедуру с моей веб-службы C#, я получаю сообщение об ошибке «Oracle.DataAccess.Client.OracleException: ORA-06502: PL/SQL: числовая или ошибка значения» при выполнении, а не во время компиляции.ORA-06502: PL/SQL: числовая или значение ошибка вызова хранимой процедуры из веб-службы C#

если я закомментируйте cmd.ExecuteNonQuery() и возвращение pout_addr_code.Value ... линии будет работать нормально и выходной мою тестовую строку.

Если удалить выход varchar2 из процедуры и закомментируйте раздел, добавив параметр pout_descr и закомментировать возвращения «Я вернулся ...» он прекрасно работает, в том числе возврата значения из хранимой процедуры.

Так что, мне кажется, проблема заключается в выполнении NonQuery когда процедура имеет линию OracleDbType.Varchar2. Есть ли другой способ, который определяется при добавлении выходного параметра в C# с использованием ссылки Oracle.DataAccess? Я нашел this post, прося о подобной ошибке, но его решение было 'указать максимальное значение VARCHAR2 до 32767 в C#', но я не вижу, как вы это делаете.

вот мой C# код:

public string AutoPmtPost(string company_code, int customer_code) 
    { 
     string oradb = "Data Source=MySource; User Id=MyID; Password=MyPassword;"; 
     OracleConnection conn = new OracleConnection(oradb); 
     conn.Open(); 
     OracleCommand cmd = new OracleCommand("USP_JEFF_TEST", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add("pin_company_code", OracleDbType.Varchar2, ParameterDirection.Input).Value = company_code; 

     cmd.Parameters.Add("pin_customer_code", OracleDbType.Int32, ParameterDirection.Input).Value = customer_code; 

     OracleParameter pout_addr_code = new OracleParameter("pout_addr_code", OracleDbType.Int32); 
     pout_addr_code.Direction = ParameterDirection.Output; 
     cmd.Parameters.Add(pout_addr_code); 

     OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2); 
     pout_descr.Direction = ParameterDirection.Output; 
     cmd.Parameters.Add(pout_descr); 

     cmd.ExecuteNonQuery(); 
     //return pout_addr_code.Value.ToString(); 
     return "I returned something"; 
    } 

Спасибо.

ответ

4
OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2); 

должен быть

OracleParameter pout_descr = new OracleParameter("pout_descr", OracleDbType.Varchar2, 2000);