2015-06-30 9 views
7

Ich versuche, eine gespeicherte Oracle-Prozedur (1 Eingabe und 2 out-Parameter) mit C# auszuführen.Fehler beim Ausführen von Oracle Stored Procedure mit C#

Meine Tabelle enthält 3 Spalten; eine Ganzzahl id und 2 Spalten vom Typ varchar2.

Dies ist Tabellendefinition:

CREATE TABLE TESTTABLE 
(
    ID INT Not Null, 
    FNAME VARCHAR2(200), 
    LNAME VARCHAR2(200), 
    Constraint PK Primary Key (ID) 
); 

Das ist mein gespeicherte Prozedur:

create or replace PROCEDURE TESTP 
(
    tempID IN TESTTABLE.ID%Type, 
    tempName Out TESTTABLE.NAME%TYPE, 
    tempLName out TESTTABLE.LNAME%TYPE 
) 
AS 
BEGIN 
    select Name, LNAME 
    into tempName, tempLName 
    from TestTable 
    where ID = tempID; 
END; 

Hier ist der Code dieses Verfahren von C# ausführen:

try 
{ 
      Int32 id = 1; 
      string FName = "", LName = ""; 

      using (_ora.GetOracleConnection()) 
      { 
       Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand("TESTP", _ora.GetOracleConnection()); 
       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.Parameters.Add("tempId", Oracle.DataAccess.Client.OracleDbType.Int32,ParameterDirection.Input).Value = id; 
       cmd.Parameters.Add("tempName", Oracle.DataAccess.Client.OracleDbType.Varchar2,200,ParameterDirection.Output).Value = FName; 
       cmd.Parameters.Add("tempLName", Oracle.DataAccess.Client.OracleDbType.Varchar2,200,ParameterDirection.Output).Value = LName; 

       cmd.ExecuteNonQuery(); 
      } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.ToString()); 
} 

Das ist das ist Ausnahme generiert:

Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL: numerische oder Wertfehler
ORA-06512: bei "USMANDBA.TESTP", Linie 9

Kann mir jemand helfen?

+0

Können Sie den Code von '_ora.GetOracleConnection()'? –

+0

ist nur eine Methode, um das gerade geöffnete oracleconnection-Objekt zurückzugeben. –

+0

So wird die Verbindung eingerichtet: con = new OracleConnection(); con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings ["MyConnection"]. ConnectionString.ToString(); con.Open(); und das ist die Methode public OracleConnection GetOracleConnection() { return this.con; } –

Antwort

2

Diese Änderungen im Code für mich gearbeitet:

using (connection) 
{ 
    Int32 id = 1; 
    OracleCommand cmd = new OracleCommand("TESTP", connection); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("tempID", OracleDbType.Int32, ParameterDirection.Input).Value = id; 
    cmd.Parameters.Add("tempName", OracleDbType.Varchar2, 200).Direction = ParameterDirection.Output; 
    cmd.Parameters.Add("tempLName", OracleDbType.Varchar2, 200).Direction = ParameterDirection.Output; 
    cmd.ExecuteNonQuery(); 
    string FName = cmd.Parameters["tempName"].Value.ToString(); 
    string LName = cmd.Parameters["tempLName"].Value.ToString(); 
} 

Sie auch NO_DATA_FOUND Ausnahme Ausnahmeblocks in Oracle-Prozedur hinzufügen könnten zu handhaben und ORA-01403 Fehler vermeiden, wie hier:

CREATE OR REPLACE PROCEDURE TESTP (tempID IN TESTTABLE.ID%Type, 
    tempName out TESTTABLE.NAME%TYPE, tempLName out TESTTABLE.LNAME%TYPE) AS 
BEGIN 
    select Name, LNAME Into tempName,tempLName from TestTable Where ID = tempID; 
EXCEPTION WHEN NO_DATA_FOUND THEN 
    tempName := null; 
    tempLName := null; 
END; 

und füge zusätzlicher OUT-Parameter, der über Erfolg oder Fehlschlag informiert und ihn im C# -Code behandelt.

+0

danke dir so viel bro .. es hat geklappt .. –