web-dev-qa-db-fra.com

Comment utiliser le paramètre OUTPUT dans une procédure stockée

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.

6
Sandy

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.

7
Anthony Pegram

Il y a plusieurs choses que vous devez aborder pour que cela fonctionne

  1. Le nom est faux ce n'est pas @ouput son @code 
  2. Vous devez définir la direction du paramètre sur Sortie.
  3. N'utilisez pas AddWithValue car il n'est pas supposé avoir une valeur juste pour vous Add.
  4. Utilisez 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());
24
Conrad Frix
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;
1
user596075

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 .

1
Bryan Crosby

Vous devez fermer la connexion avant de pouvoir utiliser les paramètres de sortie .

con.Close();
MessageBox.Show(cmd.Parameters["@code"].Value.ToString());
0
Sean