2017-02-22 20 views
1

私は比較的新しいC#とOracleです。私は、Oracleのストアドプロシージャで、C#コードに値を返さないという問題があります。私は解決策を探して数日間過ごしました。ウェブ上でこのトピックに関するすべてを試してみました。そして私はまだこの仕事をすることができないので、私が得ることができるすべての助けに本当に感謝します。戻り値が格納されていないストアドプロシージャ

私は現在のコードを投稿しています(それぞれ、oracleストアドプロシージャとc#コード)。この現在のソリューションはエラーを返しませんが、ストアドプロシージャは結果を返さないという問題があります(C#コードの 'dr.HasRows'はfalseを返します)。私は(OUTパラメータなしで)私のストアドプロシージャをOracleでチェックしています。つまり、正しい値を返すはずです。また、プロシージャではなく、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); 
    } 
    } 

}

+2

あなたのストアドプロシージャ自体は**任意の**行を返さないと、あなたのコードが出力パラメータを読み取ることはありません。 DataReaderは、クエリによって返された* rows *を読み取ります。出力パラメータを読みたい場合は、 'cmd.Parameters [" o_sco "]を使用します。値' –

+1

プロシージャを使用する理由はありますか?あなたは単一の数字を返します - なぜ機能を使用しないのですか? –

+0

@PanagiotisKanavosあなたの迅速な返答をありがとう。どのようにして私のコードを正確に置き換えるべきか、アドバイスしてください。私はかなり理解していない。私のストアドプロシージャは正しいですか?私のC#コードだけが修正が必要ですか?あるいは私は両方で間違っていますか?ありがとうございました。 – Flin

答えて

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; 
/
+0

時間をとってくれてありがとう、フレデリック。あなたはたくさん助けてくれました。感謝。私はすぐに最終的な解決策を投稿します。 – Flin

0

は助けてありがとうございました。あなたの助けといくつかの追加の研究をして、私はこの仕事をすることができます。私は実際にストアドプロシージャと関数(フレデリックアルバレスのおかげで)を使用して、両方のソリューションを作成しました。ちょうどその場合、誰もが将来同様の問題を抱えているでしょう。 Oracleを使用して

1.手順

を保管していました。 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の機能

使用。 Oracle Function:

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

もう一度ありがとう。

敬具、 フリン

関連する問題