Comment renvoyer des parameters de sortie Oracle à partir d’une procédure stockée dans .NET

J’ai de graves problèmes pour récupérer les données du SP. J’essayais de le faire comme ça:

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.ToSsortingng(), 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); 

Mais il ne renvoie rien aux variables succès ou errorMessage. Qu’est-ce que je fais mal? Y a-t-il un meilleur moyen? Cela fonctionne bien lorsqu’il est exécuté directement sur Oracle.

Il semble que vous ne pouvez pas utiliser la variable existante comme paramètre de sortie, essayez plutôt cette méthode

 ora_cmd.Parameters.Add("Lc_Exito", OracleDbType.Int32).Direction = ParameterDirection.Output; ora_cmd.ExecuteNonQuery(); if (ora_cmd.Parameters["Lc_Exito"].value == 0) 

Je n’ai trouvé aucun endroit où il documente l’ensemble du processus au même endroit. Après avoir heurté ma tête contre le mur, voici ma version de ce que j’ai proposé, utilisant l’un des parameters de sortie du code de l’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 .ToSsortingng() on param.Value if you do - I was using ssortingngs so not sure about OP's exact case 

Ensuite, la procédure stockée doit être configurée pour accepter le paramètre OUT et vous devez l’affecter dans la procédure:

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

Évidemment, cela exclut tous les autres parameters qui ont été envoyés et les autres parameters “out” – voulait simplifier les choses. Mais cela montre comment tout est configuré, avant, pendant et après l’appel de la procédure stockée dans le C #, et comment définir le paramètre OUT et extraire la valeur de la procédure stockée.