0

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

最常见的错误是:“ORA-06502: PL/SQL: numeric or value error: string buffer too small ORA-06512: at line 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;
4

3 回答 3

1

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

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

我将其更改为下面并且它起作用了。

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

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

于 2013-09-12T08:29:03.123 回答
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;
于 2014-10-29T06:22:57.547 回答
0

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

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

我被困了一段时间:-(

于 2019-03-01T10:31:32.720 回答