Je suis nouveau à l'écriture de procédure stockée. J'en ai donc écrit un avec les paramètres de sortie et je souhaite accéder à la valeur de sortie, à chaud.
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 vous essayez de définir "@ code = RecItemCode", obtenez l'erreur suivante: "Une instruction SELECT qui attribue une valeur à une variable ne doit pas être combinée avec des opérations d'extraction de données."
Et j'utilise la procédure stockée en tant que:
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();
Erreur: "La référence d'objet n'est pas définie sur une instance d'objet." Je souhaite obtenir la valeur du paramètre de sortie. Comment l'obtenir?
Merci.
Le code SQL dans votre SP est incorrect. Vous voulez probablement
Select @code = RecItemCode from Receipt where RecTransaction = @id
Dans votre déclaration, vous ne définissez pas @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, car aucune valeur ne lui est jamais affectée et vous obtenez une valeur null par défaut.
L’autre problème est que votre instruction SQL, si elle est réécrite en tant que
Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id
C'est un mélange d'assignation de variable et d'extraction de données. Cela met en évidence quelques points. Si vous avez besoin des données qui alimentent @code en plus d'autres parties des données, oubliez le paramètre de sortie et sélectionnez simplement les données.
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id
Si vous avez juste besoin du code, utilisez la première instruction SQL que je vous ai montrée. Au cas où vous auriez besoin de la sortie et des données, utilisez deux instructions différentes
Select @code = RecItemCode from Receipt where RecTransaction = @id
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id
Cela devrait affecter votre valeur au paramètre de sortie et renvoyer deux colonnes de données à la suite. Cependant, cela me semble terriblement redondant.
Si vous écrivez votre SP comme je l'ai montré tout en haut, appelez simplement cmd.ExecuteNonQuery();
et lisez ensuite la valeur du paramètre de sortie.
Un autre problème avec votre SP et votre code. Dans votre SP, vous avez déclaré @code comme varchar
. Dans votre code, vous spécifiez le type de paramètre comme Int
. Modifiez votre SP ou votre code pour rendre les types cohérents.
Remarque: si vous ne renvoyez qu'une seule valeur, il existe un autre moyen de le faire sans aucun paramètre de sortie. Tu pourrais écrire
Select RecItemCode from Receipt where RecTransaction = @id
Et utilisez ensuite object obj = cmd.ExecuteScalar();
pour obtenir le résultat. Aucun paramètre de sortie requis dans le SP ni dans votre code.
Il y a plusieurs choses que vous devez aborder pour que cela fonctionne
@ouput
son @code
AddWithValue
car il n'est pas supposé avoir une valeur juste pour vous Add
.ExecuteNonQuery
si vous ne renvoyez pas de lignes Essayer
SqlParameter output = new SqlParameter("@code", SqlDbType.Int);
output.Direction = ParameterDirection.Output;
cmd.Parameters.Add(output);
cmd.ExecuteNonQuery();
MessageBox.Show(output.Value.ToString());
SqlCommand yourCommand = new SqlCommand();
yourCommand.Connection = yourSqlConn;
yourCommand.Parameters.Add("@yourParam");
yourCommand.Parameters["@yourParam"].Direction = ParameterDirection.Output;
// execute your query successfully
int yourResult = yourCommand.Parameters["@yourParam"].Value;
Vous devez définir le paramètre de sortie en tant que paramètre de sortie dans le code avec l'énumération ParameterDirection.Output
. Il existe de nombreux exemples de cela, mais en voici un sur MSDN .
Vous devez fermer la connexion avant de pouvoir utiliser les paramètres de sortie .
con.Close();
MessageBox.Show(cmd.Parameters["@code"].Value.ToString());