存储过程不返回值

时间:2017-02-22 12:35:43

标签: c# oracle ado.net return-value

我对c#和Oracle都比较新。我遇到的问题是Oracle存储过程没有将值返回给我的c#代码。我花了几天时间寻找解决方案,尝试在网络上找到关于这个主题的所有内容。我仍然无法完成这项工作,所以我真的很感激我能得到的任何帮助。

我发布了我现有的代码(分别是oracle存储过程和c#代码)。这个当前的解决方案不会返回任何错误,但问题是存储过程不会返回任何结果(我的c#代码中的'dr.HasRows'返回false)。我已经在Oracle上检查了我的存储过程(没有OUT参数),它可以正常工作,这意味着它返回正确的值。另外,如果我使用嵌入式SQL语句而不是过程,那么我的c#代码可以正常工作。

这是我的Oracle存储过程:

CREATE OR REPLACE PROCEDURE P_TIP_PODJETJA
(
   tip in number,
   o_sco out number
)
AS
   sco number;
BEGIN
   select score into sco
   from sco_sif_score a
   where a.sif_kat = 3
   and a.tip_pod = tip;
   o_sco:= sco;
END P_TIP_PODJETJA;

这是我的c#代码:

using (OracleCommand cmd = new OracleCommand())
{
  cmd.Connection = conn;                    
  cmd.CommandText = "P_TIP_PODJETJA";
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Parameters.Add(new OracleParameter("tip", Podjetje.TipSub));
  cmd.Parameters.Add(new OracleParameter("o_sco", OracleDbType.Decimal, ParameterDirection.Output));
  cmd.BindByName = true;
  using (OracleDataReader dr = cmd.ExecuteReader())
  {
    if (dr.HasRows)
    {
      dr.Read();
      Score.ScoTipPodjetja = dr.GetDecimal(0);
    }
  }

}

2 个答案:

答案 0 :(得分:1)

CREATE OR REPLACE FUNCTION P_TIP_PODJETJA(tip in number) RETURN NUMBER
IS
   SCO   NUMBER;
BEGIN
   -- make sure your query always returns only one row
   -- otherwise you need to use a cursor or something else
   BEGIN
      EXECUTE IMMEDIATE 'select score 
         from sco_sif_score a
         where a.sif_kat = 3 and a.tip_pod = :a'
         INTO SCO USING tip; --tip = :a
      EXCEPTION 
         WHEN NO_DATA_FOUND THEN NULL;
   END;
   RETURN SCO;
END P_TIP_PODJETJA;
/

答案 1 :(得分:0)

谢谢大家的帮助。在您的帮助和一些额外的研究中,我设法使这项工作成功。我实际上已经创建了两个解决方案,分别使用存储过程和函数(感谢Frederick Alvarez)。以防万一,其他人将来会有类似的问题。

<强> 1。使用Oracle存储过程

一个。 Oracle存储过程:

create or replace PROCEDURE P_TIP_PODJETJA
(
    tip in number,
    o_sco out number
)
AS
    sco number;
BEGIN
    select score into sco
    from sco_sif_score a
    where a.sif_kat = 3
    and a.tip_pod = tip;
    o_sco:= sco;
END P_TIP_PODJETJA;

湾C#代码:

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

    cmd.CommandText = "P_TIP_PODJETJA";
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add(new OracleParameter("tip", Podjetje.TipSub));
    cmd.Parameters.Add(new OracleParameter("o_sco", OracleDbType.Decimal, ParameterDirection.Output));
    cmd.BindByName = true;

    cmd.ExecuteNonQuery();

    Score.ScoTipPodjetja = (long)(OracleDecimal)cmd.Parameters["o_sco"].Value;
}

<强> 2。使用Oracle函数

一个。 Oracle功能:

create or replace FUNCTION F_TIP_PODJETJA(tip in number) RETURN NUMBER
IS
    SCO   NUMBER;
BEGIN
    -- make sure your query always returns only one row
    -- otherwise you need to use a cursor or something else
    BEGIN
        EXECUTE IMMEDIATE 'select score 
            from sco_sif_score a
            where a.sif_kat = 3 and a.tip_pod = :a'
            INTO SCO USING tip; --tip = :a
        EXCEPTION
            WHEN NO_DATA_FOUND THEN NULL;
    END;
            RETURN SCO;
END F_TIP_PODJETJA;

湾C#代码:

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

    cmd.CommandText = "F_TIP_PODJETJA";
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add(new OracleParameter("tip", Podjetje.TipSub));
    cmd.Parameters.Add(new OracleParameter("sco", OracleDbType.Decimal, ParameterDirection.ReturnValue));
    cmd.BindByName = true;

    cmd.ExecuteNonQuery();

    Score.ScoTipPodjetja = (long)(OracleDecimal)cmd.Parameters["sco"].Value;
}

再次感谢。

亲切的问候, FLIN