【问题标题】:Stored procedure not returning value存储过程不返回值
【发布时间】:2017-07-12 12:19:05
【问题描述】:

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

我正在发布我拥有的当前代码(分别是 oracle 存储过程和 c# 代码)。此当前解决方案不返回任何错误,但问题是存储过程不返回任何结果(我的 c# 代码中的“dr.HasRows”返回 false)。我已经检查了我在 Oracle 上的存储过程(没有 OUT 参数),它可以正常工作,这意味着它返回了正确的值。此外,如果我使用 in-lay 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);
    }
  }

}

【问题讨论】:

  • 您的存储过程本身不会返回任何 rows 并且您的代码不会读取输出参数。 DataReader 读取查询返回的 rows。如果要读取输出参数,请使用cmd.Parameters["o_sco"].Value
  • 你使用程序有什么原因吗?您返回一个数字 - 为什么不使用 FUNCTION?
  • @PanagiotisKanavos 感谢您的快速回复。您能否告知我应该如何以及在哪里替换我的代码?我不太明白。我的存储过程是否正确?只有我的 c# 代码需要更正?还是我两者都错了?谢谢。
  • @WernfriedDomscheit 感谢您的建议。我同意,但这个过程是众多过程之一,而且大多数其他过程返回更多字段,所以我只想学习如何为存储过程执行一般操作。

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


【解决方案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;
/

【讨论】:

  • 感谢您抽出宝贵时间,弗雷德里克。你帮了很多忙。赞赏。我会尽快发布最终解决方案。
【解决方案2】:

感谢大家的帮助。在您的帮助和一些额外的研究下,我设法完成了这项工作。实际上,我已经分别使用存储过程和函数(感谢 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;

b. 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 函数

一个。甲骨文功能:

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;

b. 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;
}

再次感谢。

亲切的问候, 弗林

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多