La récupération de valeur unique à partir d'une requête
Je suis d'essayer de récupérer une valeur entière à partir d'un seul tableau, en fonction de la chaîne champ nom d'utilisateur. Je l'ai essayé à l'aide d'une procédure stockée, et directe de texte. Lorsque j'exécute la procédure stockée, - je obtenir la bonne valeur de retour; cependant, le résultat ne vient pas à travers.
Ici sont à la fois des jeux de code -
Texte Direct -
public int GetUserRole(string CUSER)
{
try
{
SQLCON = new SqlConnection(connectionString);
SQLCON.Open();
SQLCommand = new SqlCommand();
SQLCommand.CommandType = CommandType.Text;
SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER;
SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = CUSER";
Int32 USRole = (Int32) SQLCommand.ExecuteScalar();
return USRole;
}
catch
{
HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false);
return 0;
}
}
Requête SQL:
ALTER PROCEDURE [dbo].[spGetUserRole]
-- Add the parameters for the stored procedure here
@username VARCHAR(50)
AS
BEGIN
-- Declare the return variable here
DECLARE @USRole as int
-- Add the T-SQL statements to compute the return value here
SELECT @USRole = tblUser.USRole FROM tblUser WHERE USUsername = @username
-- Return the result of the function
RETURN @USRole
END
OriginalL'auteur Cindy Brozyno | 2012-05-30
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas le référencement de votre paramètre correctement. Si vous ajoutez un paramètre nommé USUsername ensuite dans le texte de la commande, vous devez utiliser @USUsername:
Votre procédure stockée aurez également besoin de la mise à jour, comme le nom du paramètre, ici, doit également correspondre et vous n'avez pas besoin de la variable de retour.
Vous devriez aussi regarder à l'aide de la "aide" de la syntaxe permettant de fermer automatiquement vos connexions de base de données. Voir Scott, Hanselman l'exemple ici - http://www.hanselman.com/blog/WhyTheUsingStatementIsBetterThanASharpStickInTheEyeAndASqlConnectionRefactoringExample.aspx
OriginalL'auteur Chris
Je ne sais pas comment vous avez appelé votre procédure stockée, mais ya un bug dans la requête que vous avez posté le:
doit être remplacé par
Vous n'avez pas vraiment le paramètre de la requête, mais en essayant de trouver la valeur CUSER à l'intérieur de la colonne
OriginalL'auteur YavgenyP
Au lieu d'utiliser la valeur de retour de la procédure stockée (
RETURN @USRole
), envoie les résultats à l'aide d'une instruction Select (par exempleSelect @USRole
). Ce qui se passe, c'est que la valeur de retour d'une procédure stockée n'est pas la même chose que ce qui est utilisé par ExecuteScalar. ExecuteScalar retourne la première colonne et de la ligne de la sortie. La valeur de retour est différent et doit accéder à l'aide du spécialement paramètre nommé@RETURN_VALUE
ou deParameterDirection.ReturnValue
propriété.Une version révisée de votre procédure ressemblerait à:
RETOUR (Transact-SQL)
SqlCommand.Méthode ExecuteScalar
Le bit au sujet de la "spécialement paramètre nommé
@RETURN_VALUE
" n'est vrai que si vous dériver les paramètres du serveur par exempleSqlCommandBuilder.DeriveParameters(cmd);
. Sinon, leParameterDirection.ReturnValue
est ce qui compte et le nom est arbitraireOriginalL'auteur Thomas
Utiliser le paramètre correctement. Et n'oublie pas de fermer la connexion sur enfin relevé.
OriginalL'auteur hkutluay
Si vous insistez sur l'utilisation de la valeur de retour, vous pouvez le faire en définissant le Paramètre de direction et à l'aide de la méthode ExecuteNonQuery
Si vous souhaitez utiliser ExecuteScalar alors il suffit de changer ton proc à
select
la place de la variable deReturn
Vous devriez noter que ce que vous mettez pour le paramètre nom est arbitraire.
OriginalL'auteur Conrad Frix