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
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;
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.
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;
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.