2015-06-30 16 views
7

Sto tentando di eseguire una procedura memorizzata Oracle (1 input e 2 parametri out) utilizzando C#.Errore nell'esecuzione di Stored procedure Oracle utilizzando C#

La mia tabella contiene 3 colonne; un numero intero id e 2 colonne di tipo varchar2.

Si tratta di definizione di tabella:

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

Questa è la mia stored procedure:

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; 

Ecco il codice per eseguire questa procedura da C#:

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

Questo è il eccezione generata:

Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL: numerico o valore di errore
ORA-06512: alla "USMANDBA.TESTP", la linea 9

Qualcuno mi può aiutare?

+0

Puoi pubblicare il codice di '_ora.GetOracleConnection()'? –

+0

è solo un metodo per restituire l'oggetto oracleconnection attualmente aperto. –

+0

ecco come viene configurata la connessione: con = new OracleConnection(); con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings ["MyConnection"]. ConnectionString.ToString(); con.Open(); e questo è il metodo pubblico OracleConnection GetOracleConnection() { return this.con; } –

risposta

2

Queste modifiche nel codice ha funzionato per me:

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

Si potrebbe anche aggiungere blocchi di eccezione nella procedura di Oracle per gestire eccezione NO_DATA_FOUND ed evitare ORA-01403 errore, come qui:

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; 

e aggiungere parametro OUT aggiuntivo che informa su successo o fallimento e lo gestisce nel codice C#.

+0

grazie mille fratello .. ha funzionato .. –

Problemi correlati