77 votes

Obtention de la valeur de retour d'une procédure stockée en C #

J'ai la requête suivante:

 set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[Validate]
@a varchar(50),
@b varchar(50) output

AS

SET @Password = 
(SELECT Password
FROM dbo.tblUser
WHERE Login = @a)

RETURN @b
GO
 

Cela compile parfaitement bien.

En C #, je veux exécuter cette requête et obtenir la valeur de retour.

Mon code est comme ci-dessous:

   SqlConnection SqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyLocalSQLServer"].ConnectionString.ToString());
        System.Data.SqlClient.SqlCommand sqlcomm = new System.Data.SqlClient.SqlCommand("Validate", SqlConn);

        string returnValue = string.Empty;

        try
        {
            SqlConn.Open();
            sqlcomm.CommandType = CommandType.StoredProcedure;

            SqlParameter param = new SqlParameter("@a", SqlDbType.VarChar);
            param.Direction = ParameterDirection.Input;
            param.Value = Username;
            sqlcomm.Parameters.Add(param);



            SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);
            retval.Direction = ParameterDirection.ReturnValue;


            string retunvalue = (string)sqlcomm.Parameters["@b"].Value;
 

Remarque: La gestion des exceptions est coupée pour garder le code court. Chaque fois que j'arrive à la dernière ligne, la valeur null est renvoyée. Quelle est l'erreur de logique avec ce code?

Merci

96voto

Joel Coehoorn Points 190579

Mehrdad fait quelques bons points, mais ce que j'ai surtout remarqué, c'est que vous n'exécutez jamais la requête ...

 SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);
retval.Direction = ParameterDirection.ReturnValue;
sqlcomm.ExecuteNonQuery(); // MISSING
string retunvalue = (string)sqlcomm.Parameters["@b"].Value;
 

63voto

Mehrdad Afshari Points 204872
 retval.Direction = ParameterDirection.Output;
 

ParameterDirection.ReturnValue doit être utilisé pour la "valeur de retour" de la procédure, pas pour les paramètres de sortie. Il obtient la valeur renvoyée par l'instruction SQL RETURN (avec le paramètre nommé @RETURN_VALUE ).

Au lieu de RETURN @b vous devriez SET @b = something

Au fait, le paramètre de valeur de retour est toujours int , pas de chaîne.

13voto

Alan Jackson Points 3420

J'avais des tonnes de problèmes avec la valeur de retour, alors j'ai fini par sélectionner des choses à la fin.

La solution consistait simplement à sélectionner le résultat à la fin et à renvoyer le résultat de la requête dans votre fonction.

Dans mon cas, je faisais un chèque existe:

 IF (EXISTS (SELECT RoleName FROM dbo.Roles WHERE @RoleName = RoleName)) 
	SELECT 1
ELSE
	SELECT 0
 

ensuite

 using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
    SqlCommand cmd = cnn.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "RoleExists";
    return (int) cmd.ExecuteScalar()
}
 

Vous devriez pouvoir faire la même chose avec une valeur de chaîne au lieu d'un int.

5voto

Manatherin Points 2685

Ceci s'appuie sur joel et mehrdads répondent donc, en plus, vraiment, si vous ne liez jamais le paramètre de retval à la commande sql, vous avez besoin d'un

 sqlcomm.Parameters.Add(retval);
 

et pour vous assurer que vous exécutez la commande

 sqlcomm.ExecuteNonQuery();
 

Également pas vraiment sûr pourquoi vous avez 2 chaînes de retour valeur (returnValue et retunvalue)

4voto

Martin Brown Points 8593

Vous dites que votre code SQL compile bien, mais je comprends: Vous devez déclarer la variable scalaire "@Password".

De même, vous essayez de renvoyer un varchar (@b) à partir de votre procédure stockée, mais les procédures stockées SQL Server ne peuvent renvoyer que des entiers.

Lorsque vous exécutez la procédure, vous obtenez l'erreur:

"La conversion a échoué lors de la conversion de la valeur varchar" x "en type de données int."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X