Comment utiliser le paramètre de SORTIE dans une Procédure Stockée
Je suis nouveau à l'écriture de la Procédure Stockée. J'ai donc écrit un avec les paramètres de sortie et souhaitez accéder à la valeur de sortie, chaud pour le faire.
Ma Procédure Stockée:
ALTER PROCEDURE selQuery
(
@id int, @code varchar(50) OUTPUT
)
AS
SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id
RETURN @code
Si en essayant de mettre "@code=RecItemCode" avoir d'erreur comme : "UNE instruction SELECT qui assigne une valeur à une variable ne doit pas être combinées avec les Données des opérations de Récupération."
Et je suis en utilisant la Procédure Stockée comme:
con.Open();
cmd.Parameters.AddWithValue("@id", textBox1.Text);
SqlParameter code = new SqlParameter("@code", SqlDbType.Int);
code.Direction = ParameterDirection.Output;
cmd.Parameters.Add(code);
SqlDataReader sdr = cmd.ExecuteReader();
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); //getting error
con.Close();
D'erreur : "la référence d'Objet n'est pas définie à une instance d'un objet."
Je veux obtenir la valeur de paramètre de sortie. Comment obtenir que?
Grâce.
Vous devez vous connecter pour publier un commentaire.
Le SQL dans votre SP est faux. Vous voulez probablement
Dans votre déclaration, vous n'avez pas réglé @code, vous essayez de l'utiliser pour la valeur de RecItemCode. Cela expliquerait votre
NullReferenceException
lorsque vous essayez d'utiliser le paramètre de sortie, parce qu'une valeur n'est jamais assigné et vous obtenez un null par défaut.L'autre problème, c'est que votre instruction SQL si réécrit comme
C'est un mélange de l'attribution de la variable et la récupération des données. Cela met en évidence un couple de points. Si vous avez besoin des données qui est le moteur de @code en plus à d'autres parties des données, oublier le paramètre de sortie et il suffit de sélectionner les données.
Si vous avez juste besoin d'un code, la première instruction SQL que je vous ai montré. Sur la main gauche, chance vous avez réellement besoin de la sortie et les données, l'utilisation de deux différents états
Cela devrait affecter votre valeur pour le paramètre de sortie, ainsi que le retour de deux colonnes de données dans une rangée. Cependant, cela me semble terriblement redondant.
Si vous écrivez votre SP comme je l'ai indiqué tout en haut, suffit de l'appeler
cmd.ExecuteNonQuery();
, puis lire la valeur de paramètre de sortie.Un autre problème avec votre SP et le code. Dans votre SP, vous avez déclaré @code
varchar
. Dans votre code, vous devez spécifier le type de paramètre queInt
. Soit changer votre SP ou votre code pour les types compatibles.À noter également: Si tout ce que vous faire est de retourner une seule valeur, il y a une autre façon de faire qui ne nécessite pas de paramètres de sortie à tous. Vous pouvez écrire
Et ensuite utiliser
object obj = cmd.ExecuteScalar();
pour obtenir le résultat, pas besoin d'un paramètre de sortie de la SP ou dans votre code.Il y a plusieurs choses que vous avez besoin de l'adresse pour le faire fonctionner
@ouput
son@code
AddWithValue
puisque ce n'est pas censé avoir une valeur juste vousAdd
.ExecuteNonQuery
si vous n'êtes pas retourner des lignesEssayer
cmd.ExecuteNonQuery(); int value = (int)output.Value;
RecItemCode = @code
, qui est d'essayer d'attribuer le @code pour RecItemCode. Vous n'avez jamais mis @code., RecUsername
de SQL (et la fixation de l'affectation du paramètre). Ou vous pouvez résoudre votre problème à l'aide de deux instructions SQL distinctes: l'une pour définir le paramètre de sortie, une pour récupérer vos données.Vous devez définir le paramètre de sortie comme un paramètre de sortie dans le code avec le
ParameterDirection.Output
énumération. Il existe de nombreux exemples de ce là-bas, mais en voici une sur MSDN.Vous avez besoin de fermer la connexion avant de pouvoir utiliser les paramètres de sortie.
Quelque chose comme ceci