2017-02-22 4 views
1

Ich bin relativ neu in beiden, C# und Oracle. Ich habe ein Problem mit der gespeicherten Oracle-Prozedur, die keinen Wert an meinen C# -Code zurückgibt. Ich habe mehrere Tage nach einer Lösung gesucht und alles versucht, was ich zu diesem Thema im Internet finden konnte. Und ich kann es immer noch nicht schaffen, also würde ich jede Hilfe, die ich bekommen kann, sehr schätzen.Gespeicherte Prozedur gibt keinen Wert zurück

Ich poste aktuellen Code Ich habe (Orakel gespeicherte Prozedur und C# -Code, jeweils). Diese aktuelle Lösung gibt keinen Fehler zurück, aber das Problem besteht darin, dass die gespeicherte Prozedur kein Ergebnis zurückgibt ("dr.HasRows" in meinem C# -Code gibt false zurück). Ich habe meine gespeicherte Prozedur auf Oracle überprüft (ohne OUT-Parameter) und es funktioniert wie es sollte, dh es gibt den richtigen Wert zurück. Außerdem funktioniert mein C# -Code gut, wenn ich eine In-Laie-SQL-Anweisung anstelle einer Prozedur verwende.

Hier ist meine Oracle gespeicherte Prozedur:

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; 

Und hier ist mein C# -Code:

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

Ihre gespeicherte Prozedur selbst liefert keine ** ** Zeilen und Ihr Code nicht liest die Ausgangsparameter. Ein DataReader liest die von der Abfrage zurückgegebenen * Zeilen *. Wenn Sie den Ausgabeparameter lesen möchten, verwenden Sie 'cmd.Parameters [" o_sco "]. Wert' –

+1

Gibt es einen Grund, warum Sie eine Prozedur verwenden? Sie geben eine einzelne Zahl zurück - warum nicht eine FUNCTION? –

+0

@ PanagiotisKanavos Danke für Ihre schnelle Antwort. Könnten Sie bitte mitteilen, wie und wo genau ich meinen Code ersetzen soll? Ich verstehe das nicht ganz. Ist meine gespeicherte Prozedur korrekt? Und nur mein C# -Code muss korrigiert werden? Oder liege ich falsch in beiden? Vielen Dank. – Flin

Antwort

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

Danke, dass du dir Zeit genommen hast, Frederick. Du hast viel geholfen. Geschätzt. Ich werde die endgültige Lösung in Kürze veröffentlichen. – Flin

0

Vielen Dank für die Unterstützung. Mit Ihrer Hilfe und einigen zusätzlichen Recherchen gelingt es mir, dies zu erreichen. Ich habe beide Lösung mit gespeicherten Prozedur und Funktion (Dank an Frederick Alvarez) erstellt. Nur für den Fall, jemand anderes würde in Zukunft ähnliche Probleme haben.

1. Verwenden von Oracle Stored Procedure

ein. Oracle gespeicherte Prozedur:

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# Code:

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. Verwenden von Oracle Funktion

ein. Oracle-Funktion:

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# Code:

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

Nochmals vielen Dank.

Mit freundlichen Grüßen, Flin

Verwandte Themen