2013-01-09 17 views
8

Mam poważne problemy z odzyskaniem danych z SP. Próbowałem zrobić to w ten sposób:Jak zwracać parametry wyjściowe oracle z procedury składowanej w .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); 

Ale to nie jest zwracanie niczego do zmiennych sukcesu lub komunikatu błędu. Co ja robię źle? Czy istnieje lepszy sposób? Działa dobrze, gdy jest wykonywany bezpośrednio na Oracle.

Odpowiedz

13

Wydaje się, że nie mogą korzystać z istniejącej zmiennej jako parametru wyjściowego, spróbuj w ten sposób zamiast

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

ora_cmd.ExecuteNonQuery(); 

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

Tak, masz absolutną rację. Nie oczekiwałem, że parametry oracle będą tak specyficzne w porównaniu do sql. Niż bardzo. –

+1

'if (ora_cmd.Parameters [" Lc_Exito "]). Value == 0)' ma dodatkowy nawias. Czy masz na myśli 'if (ora_cmd.Parameters [" Lc_Exito "]. Value == 0)'? – stephen

1

nie znalazłem nigdzie w którym dokumentuje cały proces w jednym miejscu, więc po uderzeniu głową o ścianę i walić go, oto moja wersja tego, co wymyśliłem, używając jednego z parametrów wyjściowych z kodem oP:

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 

Następnie procedura przechowywana musi być ustawiony, aby zaakceptować parametr OUT i musisz przypisać do niego w th Procedura E:

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

Oczywiście pozostawia wszystkie inne parametry, które były wysłane w i innych parametrów „Out” - chciał go uprościć. Ale pokazuje to, jak wszystko jest skonfigurowane, od przed, w trakcie i po wywołaniu do procedury przechowywanej w C#, i jak ustawić parametr procedury przechowywanej.

+1

Chciałbym podkreślić, że właściwość "Rozmiar" jest bardzo ważna dla parametrów wyjściowych ciągu, jak wskazuje wstawiony komentarz w kodzie. –

Powiązane problemy