2013-05-09 4 views
0

У меня возникли трудности с попыткой вызвать функцию моего DBA внутри C#. Он отлично работает в браузере запросов Oracle, однако, когда я пытаюсь выполнить его на C#, он терпит неудачу.Невозможно выполнить функцию пакета Oracle в C#

Самая распространенная ошибка: "ORA-06502: PL/SQL: числовые или значение ошибки: строка символов, буфер слишком мал ORA-06512: в строке 1"

Я попытался увеличить размер параметров C#, но не имеет успеха. Не уверен, что я делаю неправильно.

C# Код:

 string returnValue = string.Empty; 
     using (OracleConnection cn = new OracleConnection("ConnectionString")) 

     { 
      using (OracleCommand cmd = new OracleCommand()) 
      { 
       cmd.Connection = cn; 


       cmd.CommandText = "package.function"; 
       cmd.CommandType = CommandType.StoredProcedure; 

       OracleParameter param1 = new OracleParameter(); 
       OracleParameter param2 = new OracleParameter(); 
       OracleParameter param3 = new OracleParameter(); 
       OracleParameter param4 = new OracleParameter(); 
       OracleParameter param5 = new OracleParameter(); 

       param1.OracleDbType = OracleDbType.Varchar2; 
       param1.Direction = ParameterDirection.Input; 
       param1.Value = "Test808"; 
       param1.ParameterName = "var1"; 
       //param1.Size = 2000; 

       param2.OracleDbType = OracleDbType.Varchar2; 
       param2.Direction = ParameterDirection.Input; 
       param2.Value = "68B54814"; 
       param2.ParameterName = "var2"; 
       //param2.Size = 2000; 

       param3.OracleDbType = OracleDbType.Varchar2; 
       param3.Direction = ParameterDirection.Input; 
       param3.Value = "71839"; 
       param3.ParameterName = "var4"; 
       //param3.Size = 2000; 

       param4.OracleDbType = OracleDbType.Varchar2; 
       param4.Direction = ParameterDirection.Input; 
       param4.Value = 55 ; 
       param4.ParameterName = "var4"; 
       //param4.Size = 2000; 

       param5.OracleDbType = OracleDbType.Varchar2; 
       param5.Direction = ParameterDirection.ReturnValue; 
       param5.ParameterName = "return"; 
       //param5.Size = 2000; 



       cmd.Parameters.Add(param1); 
       cmd.Parameters.Add(param2); 
       cmd.Parameters.Add(param3); 
       cmd.Parameters.Add(param4); 
       cmd.Parameters.Add(param5); 


       try 
       { 
        cn.Open(); 

        cmd.ExecuteNonQuery(); 

        returnValue = cmd.Parameters["return"].Value.ToString(); 
       } 
       catch 
       { 

       } 
       finally 
       { 
        cn.Close(); 
       } 

      } 
     } 

     return returnValue; 

Функция Заголовок:

FUNCTION create_rec 
     (p_mims_pallet_id varchar2 
     ,p_item_no varchar2 
     ,p_packer_id varchar2 
     ,p_tare_wt varchar2 
    ) 
     return varchar2 

первый раз пытается Oracle называет. Никогда не было проблем с SQL. Параметр.Size закомментирован, поскольку ничего не делает.

Удалось заставить его работать, удалив отдельные параметры и создав им метод Parameter.Add.

Рабочий код:

 string returnValue = string.Empty; 
     using (OracleConnection cn = new OracleConnection("ConString")) 

     { 
      using (OracleCommand cmd = new OracleCommand()) 
      { 
       cmd.Connection = cn; 
       cmd.CommandText = "package.function"; 
       cmd.CommandType = CommandType.StoredProcedure; 


       cmd.Parameters.Add("rv", OracleDbType.Varchar2, 200, "", ParameterDirection.ReturnValue); 
       cmd.Parameters.Add("var1", OracleDbType.Varchar2, 20, "Test808", ParameterDirection.Input); 
       cmd.Parameters.Add("var2", OracleDbType.Varchar2, 20, "68B54814", ParameterDirection.Input); 
       cmd.Parameters.Add("var3", OracleDbType.Varchar2, 20, "71839", ParameterDirection.Input); 
       cmd.Parameters.Add("var4", OracleDbType.Decimal, 55, ParameterDirection.Input); 

       try 
       { 
        cn.Open(); 

        cmd.ExecuteNonQuery(); 

        returnValue = cmd.Parameters["rv"].Value.ToString(); 
       } 
       catch 
       { 

       } 
       finally 
       { 
        cn.Close(); 
       } 

      } 
     } 

     return returnValue; 
+1

проверка на VARCHAR2 размеры полей, которые вы пытаетесь вставить/обновить и сравнить со значениями вы проходящими. – cableload

+1

Я уверен, что вы должны дать именам параметров C# те же имена, что и имена Oracle, поэтому вместо, например, 'param1.ParameterName =" var1 ";' try 'param1.ParameterName =" p_mims_pallet_id ";' и так на. Это не объясняет ошибку, о которой вы сообщали, но вы упомянули, что у вас есть другие. Что касается параметра 'Size', я просто удостоверяюсь, что он, по крайней мере, достаточно большой для значения, которое я передаю; больше должно быть хорошо. –

+0

Я проверил структуру таблицы, и все проверено. Я считаю, что это что-то с кодом C# на этом этапе. Если он отлично работает в конце Оракула при вызове из SQL-браузера, то я должен делать что-то неправильно. Просто не вижу этого. Изменены все имена параметров для их уважаемых имен заголовков и по-прежнему имеют ту же ошибку. Также изменился формат .Size до 2000 и вызывается такая же ошибка. –

ответ

1

Я исправил эту проблему, изменив его синтаксис. Она дает числовое значение или ошибку переполнения, если мы используем ниже синтаксис:

cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, 255, ParameterDirection.Output); 

Что я изменил ниже, и она работала.

cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, ParameterDirection.Output).Size=255; 

Надеюсь, что это сработает для вас. Спасибо. Атула

0
string strRetrun = string.Empty; 
using (OracleConnection objCon = (OracleConnection)_connection) 
     { 
      using (OracleCommand objCom = new OracleCommand()) 
      { 
       objCom.Connection = objCon; 
       objCom.CommandText = "SAM.PKG_SAM_ECH.F_FUND_TRANSFER_TYPE"; 
       objCom.CommandType = CommandType.StoredProcedure; 

       OracleParameter codeReturn = new OracleParameter("RETURN", OracleType.VarChar, 1000); 
       codeReturn.Direction = ParameterDirection.ReturnValue; 


       OracleParameter code1 = new OracleParameter("V_RECORD_ID", OracleType.Number); 
       code1.Direction = ParameterDirection.Input; 
       if (obj.RecordId != null) 
        code1.Value = obj.RecordId; 
       else 
        code1.Value = DBNull.Value; 


       OracleParameter code2 = new OracleParameter("V_DEBIT_APAC", OracleType.VarChar, 200); 
       code2.Direction = ParameterDirection.Input; 
       if (obj.P_BENEF_APAC != null) 
        code2.Value = obj.P_BENEF_APAC; 
       else 
        code2.Value = DBNull.Value; 


       OracleParameter code3 = new OracleParameter("V_ACCOUNT_TYPE", OracleType.VarChar, 200); 
       code3.Direction = ParameterDirection.Input; 
       if (obj.BenfAccType != null) 
        code3.Value = obj.BenfAccType; 
       else 
        code3.Value = DBNull.Value; 

       OracleParameter code4 = new OracleParameter("V_IFSC_CODE", OracleType.VarChar, 200); 
       code4.Direction = ParameterDirection.Input; 
       if (obj.IFSC != null) 
        code4.Value = obj.IFSC; 
       else 
        code4.Value = DBNull.Value; 


       objCom.Parameters.Add(codeReturn); 
       objCom.Parameters.Add(code1); 
       objCom.Parameters.Add(code2); 
       objCom.Parameters.Add(code3); 
       objCom.Parameters.Add(code4); 

       try 
       { 
        objCon.Open(); 

        objCom.ExecuteNonQuery(); 

        strRetrun = objCom.Parameters["RETURN"].Value.ToString(); 
       } 
       catch 
       { 

       } 
       finally 
       { 
        objCon.Close(); 
       } 

      } 
     } 


     return strRetrun; 
Смежные вопросы