C# 无法获取要在c中执行的Oracle包函数#

C# 无法获取要在c中执行的Oracle包函数#,c#,oracle,C#,Oracle,我很难在C#中调用我的DBA函数。它在Oracle查询浏览器中运行良好,但是当我尝试在C#中执行它时,它失败了 最常见的错误是:“ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小 ORA-06512:第1行“ 我试图增加C#参数的大小,但没有成功。不知道我做错了什么 C#代码: 函数标题: FUNCTION create_rec (p_mims_pallet_id varchar2 ,p_item_no varchar2 ,p_pack

我很难在C#中调用我的DBA函数。它在Oracle查询浏览器中运行良好,但是当我尝试在C#中执行它时,它失败了

最常见的错误是:“ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小 ORA-06512:第1行“

我试图增加C#参数的大小,但没有成功。不知道我做错了什么

C#代码:

函数标题:

    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被注释掉,因为它似乎不做任何事情

通过删除单个参数并创建参数,可以使其正常工作。添加方法

工作代码:

     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;

我通过修改语法解决了这个问题。如果我们使用以下语法,则会出现数字或值溢出错误:

cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, 255, ParameterDirection.Output);
我把它改成了下面的,它起作用了

cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, ParameterDirection.Output).Size=255;
希望这对你有用。 谢谢
Atul

致所有想知道为什么Tim B的答案有效的人。 这是参数的顺序! 必须首先绑定函数的返回参数! 对于其他参数,顺序计数,而不是名称

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


我在这一点上陷入了困境:-(

检查您试图插入/更新的字段的varchar2大小,并与您正在传递的值进行比较。我非常确定您必须为C参数名称指定与Oracle名称相同的名称,因此,而不是例如
param1.ParameterName=“var1”;
尝试
param1.ParameterName=“p\u mims\u托盘\u id”
等等。这并不能解释你报告的错误,但你提到了其他错误。至于参数
大小
,我只是确保它至少足够大,可以容纳我传递的值;更大也可以。我检查了表结构,所有内容都检查出来了。我相信它至少与C代码有关s点。如果从SQL浏览器调用Oracles end时,它在Oracles end上工作正常,那么我一定是做错了什么。只是看不到它。将所有参数名称更改为其受尊重的头名称,但仍然得到相同的错误。还将.Size更改为2000,并引发相同的错误。您已将param4的类型设置为Varchar2,但分配了一个整数r值。不确定这是否会导致您的错误,但修复它也无妨。
cmd.Parameters.Add("strSqlMsg", OracleDbType.Varchar2, ParameterDirection.Output).Size=255;
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;