我对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);
}
}
}
答案 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