7
votes

Comment utiliser le paramètre de sortie dans la procédure stockée

Je suis nouveau pour écrire la procédure stockée. J'ai donc écrit un avec des paramètres de sortie et souhaitez accéder à la valeur de sortie, chaud pour le faire.

Ma procédure stockée: p> xxx pré>

si vous essayez de définir "code = RecitemCode "Obtenir une erreur comme suit:" Une instruction SELECT qui attribue une valeur à une variable ne doit pas être combinée à des opérations de récupération de données. " P>

et j'utilise la procédure stockée comme: p>

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();


0 commentaires

5 Réponses :


25
votes

Il y a plusieurs choses que vous devez adresser pour le faire fonctionner

  1. Le nom est faux, ce n'est pas @oupe code> son @code code> li>
  2. Vous devez définir la direction du paramètre sur la sortie. LI>
  3. n'utilise pas addwithvalue code> car ce n'est pas censé avoir une valeur juste vous ajoutez code>. Li>
  4. Utilisez exécutenonquery code> si vous ne retournez pas de lignes li> ol>

    ESSAYEZ P>

    SqlParameter output = new SqlParameter("@code", SqlDbType.Int);
    output.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(output);
    cmd.ExecuteNonQuery();
    MessageBox.Show(output.Value.ToString());
    


11 commentaires

super, mais comment obtenir la valeur du paramètre de sortie ?? sortie.value.tostring () donnant une erreur comme "référence d'objet non définie sur une instance d'objet".


et ne dites pas "tu as oublié" parce que je n'ai pas oublié, je ne sais pas :-(


@Rapsalands, après vous exécutez la requête, récupérez la valeur du paramètre. cmd.executenonquery (); Valeur int = (int) sortie.value;


Je ne sais pas pourquoi vous obtenez une référence nulle. Peut-être devriez-vous mettre à jour votre question.


@Rapsalands, votre SP a juste l'air mal, ce n'est pas votre code pour le moment. Pour un, je ne pense pas que vous puissiez vouloir dire recitemcode = @code , qui tente d'assigner le @code à recitemcode. Vous ne définissez jamais @code.


@Antay: mais quand j'écris "@ code = rectiteCode" il donne une erreur "une instruction SELECT qui attribue une valeur à une variable ne doit pas être combinée à des opérations de récupération de données"


@Rapsalands, OK. Cependant, laissez-le comme vous l'avez pas correct. Permettez-moi de demander, que voulez-vous réellement de cette procédure stockée? Les données de la table ou de la valeur de sortie dans le paramètre? De votre requête, il ne semble pas que vous ayez vraiment besoin , car la sortie serait déjà dans les données. Et si vous avez juste besoin de la sortie, vous sélectionnez trop de dans la requête.


@Antay: J'essayais simplement d'apprendre le paramètre SP et de sortie. Une ici, je veux obtenir la valeur de rectiche dans le paramètre de sortie et l'accéder à mon code


@Rapsalands, vous pouvez corriger votre problème en supprimant le paramètre de sortie ou DÉPOSING , RECUSNERNAME à partir du SQL (et fixant l'affectation du paramètre). ou Vous pouvez corriger votre problème en utilisant deux instructions SQL distinctes: une pour définir le paramètre de sortie, une pour extraire vos données.


Ce sera vraiment génial si vous pouvez poster un échantillon comme une réponse différente. S'il vous plaît, ce SP est hanté mes beaux rêves


@Rapsalands, OK, j'ai développé mes pensées dans une réponse, j'espère que cela aura plus de sens de cette façon.



1
votes

Vous devez définir le paramètre de sortie en tant que paramètre de sortie dans le code avec le paramètre paramètredirection.output énumération. Il y en a de nombreux exemples de là, mais voici un sur MSDN .


0 commentaires

1
votes
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;

2 commentaires

@Rapsalands Vous ne pouvez pas simplement exécuter le code. Ce n'est pas un bloc de code autonome. Cette erreur disait que vous n'avez pas instancié d'objet (c'est-à-dire en créer une nouvelle instance). Il s'agissait simplement de vous donner l'idée générale de savoir comment obtenir une valeur d'un paramètre de sortie d'un PROC stocké.


En fait, j'essaie d'apprendre SP et je ne l'ai jamais fait auparavant. Ce sera génial si vous pouvez dire ce qui ne va pas avec mon code. Je veux dire où je dois créer l'instance ??



8
votes

Le SQL dans votre SP est faux. Vous voulez probablement xxx pré>

dans votre relevé, vous ne définissez pas @code, vous essayez de l'utiliser pour la valeur de RecitemCode. Cela expliquerait votre NullReferenceException code> lorsque vous essayez d'utiliser le paramètre de sortie, car une valeur n'est jamais attribuée à celle-ci et que vous obtenez une null par défaut. P>

L'autre problème est que votre instruction SQL si réécrit comme p> xxx pré>

Il mélange la facture variable et la récupération de données. Cela met en évidence quelques points. Si vous avez besoin des données qui conduisent @Code en plus des autres parties des données, oubliez le paramètre de sortie et sélectionnez simplement les données. P>

 Select RecItemCode from Receipt where RecTransaction = @id


1 commentaires

Merci et +1. 'objet obj = cmd.exectescalar ();' travaillé parfaitement. J'ai pu accomplir ce dont j'avais besoin dans deux lignes de code C #, le second étant 'mystring = obj.tostring ();'.



0
votes

Vous devez fermer la connexion avant de pouvoir utiliser les paramètres de sortie. Quelque chose comme ça xxx


0 commentaires