0

C# 内で DBA の関数を呼び出そうとするとうまくいきません。Oracle クエリ ブラウザでは問題なく動作しますが、C# で実行しようとすると失敗します。

最も一般的なエラーは次のとおりです。

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 に答える