web-dev-qa-db-fra.com

Comment renvoyer des paramètres de sortie Oracle à partir d'une procédure stockée dans .NET

J'ai de sérieux problèmes à essayer de 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.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);

Mais il ne renvoie rien aux variables sucess ou errorMessage. Qu'est-ce que je fais mal? Y a-t-il une meilleure façon? Il fonctionne correctement lorsqu'il est exécuté directement sur Oracle.

17
Jesus Zamora

Il semble que vous ne puissiez pas utiliser la variable existante comme paramètre de sortie, essayez de cette façon à la place

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

ora_cmd.ExecuteNonQuery();

if (ora_cmd.Parameters["Lc_Exito"].value == 0)
18
uowzd01

Je n'ai trouvé aucun endroit où il documente l'ensemble du processus en un seul endroit, donc après m'être cogné la tête contre le mur et l'avoir frappé, voici ma version de ce que j'ai trouvé, en utilisant l'un des paramètres 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 .ToString() on param.Value if you do - I was using strings 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 lui 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 laisse de côté tous les autres paramètres qui ont été envoyés et les autres paramètres "sortants" - voulaient le simplifier. Mais cela montre comment tout est configuré, avant, pendant et après l'appel à la procédure stockée dans le C #, et comment définir le paramètre OUT et obtenir la valeur de la procédure stockée.

4
vapcguy