【发布时间】: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