2013-01-09 16 views
8

Sto riscontrando seri problemi nel tentativo di recuperare i dati dall'SP. Stavo cercando di fare in questo modo:Come restituire i parametri di output di Oracle da una procedura memorizzata in .NET

OracleCommand ora_cmd = new OracleCommand("a6r1.PR_ABC_P_ALTA_TARJETA_PAYWARE", ora_conn); 
        ora_cmd.BindByName = true; 
        ora_cmd.CommandType = CommandType.StoredProcedure; 

        int success= new int(); 

        ora_cmd.Parameters.Add("Lc_Param_Issuer", OracleDbType.Varchar2, issuer, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Ln_Param_Valid_Product", OracleDbType.Varchar2, DropDownListProducto.SelectedValue.ToString(), ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Ln_Param_Total", OracleDbType.Int32, parsed, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Lc_Param_User", OracleDbType.Varchar2, user, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Lc_Encrypted_Password", OracleDbType.Varchar2, pass, ParameterDirection.Input); 
        ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32, success, ParameterDirection.Output); 
        ora_cmd.Parameters.Add("Lc_Error", OracleDbType.Varchar2, errorMessage, ParameterDirection.Output); 

Ma non restituisce nulla alle variabili SUCCESSO o errorMessage. Che cosa sto facendo di sbagliato? C'è un modo migliore? Funziona bene quando eseguito direttamente su Oracle.

risposta

13

Sembra che non è possibile utilizzare variabile esistente come parametro di uscita, provare in questo modo invece

ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32).Direction = ParameterDirection.Output; 

ora_cmd.ExecuteNonQuery(); 

if (ora_cmd.Parameters["Lc_Exito"].value == 0) 
+1

Sì, hai assolutamente ragione. Non mi aspettavo che i parametri di Oracle fossero così specifici rispetto a quelli di sql. Di te molto. –

+1

'if (ora_cmd.Parameters [" Lc_Exito "]). Value == 0)' contiene una parentesi aggiuntiva. Vuoi dire 'if (ora_cmd.Parameters [" Lc_Exito "]. Value == 0)'? – stephen

1

non ho trovato da nessuna parte dove si documenta l'intero processo in un unico luogo, così dopo aver colpito la testa contro il muro e sbattere fuori, ecco la mia versione di ciò che mi è venuta, utilizzando uno dei parametri di output dal codice del PO:

OracleParameter param = new OracleParameter(); 
param = ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32, ParameterDirection.Output); // can assign the direction within the parameter declaration 
param.Size = 25; // failed for me if I did not have this - should be the same as the DB field, if exporting a value from the database 

ora_cmd.ExecuteNonQuery(); 

int myLc_ExitoValue = int.Parse(param.Value); // might not need to parse, and might need a .ToString() on param.Value if you do - I was using strings so not sure about OP's exact case 

Poi la stored procedure deve essere impostato per accettare il parametro OUT e si deve assegnagli in th Procedura e:

create or replace procedure PR_ABC_P_ALTA_TARJETA_PAYWARE(Lc_Exito OUT number) 
    as 
    begin 
    Lc_Exito := 123; 
    end; 
/

Ovviamente questo lascia fuori tutti gli altri parametri che venivano inviati in e gli altri parametri "fuori" - ha voluto semplificare. Ma questo mostra come tutto viene impostato, da prima, durante e dopo la chiamata alla stored procedure nel C#, e come impostare il parametro OUT e ottenere il valore, della stored procedure.

+1

Vorrei sottolineare che la proprietà "Dimensione" è molto importante per i parametri di output della stringa, come indica il commento in linea nel codice. –

Problemi correlati