无法让Oracle Package函数在c#中执行

时间:2013-05-09 17:59:27

标签: c# oracle

我在C#中调用DBA的功能时遇到了困难。它在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问题。 parameter.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;

3 个答案:

答案 0 :(得分:1)

我通过更改其语法来修复此问题。如果我们使用以下语法,它会给出数值或值溢出错误:

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

我将其改为以下并且有效。

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

希望这对你有用。 谢谢。 阿图尔

答案 1 :(得分: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;

答案 2 :(得分:0)

对于所有想知道Tim B的答案为什么起作用的人。 这是参数的顺序! 该函数的返回参数必须首先绑定! 同样,对于其他参数,顺序也将计算在内,而不是名称。

如果将“ param5”作为第一个对象添加到集合中,则可以单独创建参数的第一个版本是可以的。

我被卡住了一段时间:-(