web-dev-qa-db-fra.com

Obtenir la valeur de retour de la procédure stockée dans asp.net

j'ai une procédure stockée 

ALTER PROC TESTLOGIN
    @UserName varchar(50),
    @password varchar(50)
As
Begin
    declare @return int;

    set @return  = (SELECT COUNT(*) 
                    FROM CPUser 
                    WHERE UserName = @UserName 
                    AND Password = @password);

    return @return;
End

et en c #

SqlConnection con = db.con;
SqlCommand cmd = new SqlCommand("TESTLOGIN", con);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter parm = new SqlParameter("@return", SqlDbType.Int);
parm.Direction = ParameterDirection.ReturnValue;

cmd.Parameters.Add(parm);
cmd.Parameters.Add(new SqlParameter("@UserName", txtUserName.Text.ToString().Trim()));
cmd.Parameters.Add(new SqlParameter("@password", txtPassword.Text.ToString().Trim()));

cmd.ExecuteNonQuery();
con.Close();

int id = Convert.ToInt32(parm.Value);

mais il retourne toujours 0. S'il vous plaît aidez-moi à résoudre ce problème

18
Ahmad Abbasi

Vous avez besoin d'un paramètre dont le paramètre Direction est défini sur ParameterDirection.ReturnValue dans le code, mais vous n'avez pas besoin d'ajouter un paramètre supplémentaire dans SP. Essaye ça

  SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
  returnParameter.Direction = ParameterDirection.ReturnValue;
  cmd.ExecuteNonQuery();

  int id = (int) returnParameter.Value;
33
Shafeeq Koorimannil

2 choses.

  • La requête doit être terminée sur le serveur SQL avant l'envoi de la valeur renvoyée.

  • Les résultats doivent être capturés et ensuite terminer l'exécution avant La valeur renvoyée est renvoyée à l'objet.

En anglais, terminez le travail puis récupérez la valeur.

cela ne fonctionnera pas:

                cmm.ExecuteReader();
                int i = (int) cmm.Parameters["@RETURN_VALUE"].Value;

Cela fonctionnera:

                        SqlDataReader reader = cmm.ExecuteReader();
                        reader.Close();

                        foreach (SqlParameter prm in cmd.Parameters)
                        {
                           Debug.WriteLine("");
                           Debug.WriteLine("Name " + prm.ParameterName);
                           Debug.WriteLine("Type " + prm.SqlDbType.ToString());
                           Debug.WriteLine("Size " + prm.Size.ToString());
                           Debug.WriteLine("Direction " + prm.Direction.ToString());
                           Debug.WriteLine("Value " + prm.Value);

                        }

en cas de doute, vérifiez la valeur du paramètre .__ avant, pendant et après le traitement des résultats par le lecteur.

2
Slick

vous pouvez essayer ceci.Ajoutez le paramètre en tant que direction de sortie et, après avoir exécuté la requête, obtenez la valeur du paramètre de sortie.

  SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int);
  parmOUT.Direction = ParameterDirection.Output;
  cmd.Parameters.Add(parmOUT);
  cmd.ExecuteNonQuery();
  int returnVALUE = (int)cmd.Parameters["@return"].Value;
1
Tushar Cse

La procédure ne renvoie jamais de valeur.Vous devez utiliser un paramètre de sortie dans la procédure de stockage.

ALTER PROC TESTLOGIN
@UserName   varchar(50),
@password   varchar(50)
@retvalue int output
 as
 Begin
    declare @return     int 
    set @return  = (Select COUNT(*) 
    FROM    CPUser  
    WHERE   UserName = @UserName AND Password = @password)

   set @retvalue=@return
  End

Ensuite, vous devez ajouter un paramètre sql à partir de c # dont la direction du paramètre est out . J'espère que cela a du sens.

0
user1990587