7
votes

Récupération de variables de sortie SQL Server en C #

J'ai une procédure stockée: xxx pré>

J'ai besoin du ID code> dans c # et de la mettre sortie code> in c #: p >

SqlParameter outparam = cmd.Parameters.Add("@guidid",SqlDbType.UniqueIdentifier);
outparam.Direction = ParameterDirection.Output;

cmd.Parameters.AddWithValue("@sname", "mehdi");

cmd.ExecuteNonQuery();
MessageBox.Show(_id.Value.ToString());


1 commentaires

Est-ce que le SP réellement définit @guidid ? Je suis plutôt la commande isnull uniquement retourne la valeur de newid () tandis que @guidid conserverait la valeur qu'il a dû commencer.


5 Réponses :


1
votes

Vous devez construire un sqlparameter Utilisation de l'un des constructeurs qui vous permet de spécifier un paramètreDirection , tels que Celui-ci . Sinon, construisez votre paramètre puis définissez la direction à l'aide de Propriété propriété .

Vérifiez ce lien sur MSDN pour plus d'informations.


0 commentaires

5
votes

Avant d'exécuter la requête, vous devez spécifier la direction du paramètre, dans ce cas de sortie. E.g.:

cmd.Parameters.AddWithValue("@guidid",_id);//_id is SqlGuid

cmd.Parameters.AddWithValue("@sname", "mehdi");

cmd.Parameters["@guidid"].Direction = ParameterDirection.Output

cmd.ExecuteNonQuery();
MessageBox.Show(cmd.Parameters["@guidid"].Value.ToString());


2 commentaires

Il devrait être paramètres ["@ guidid"] (crochets plutôt que les parents)


Cela semble contagieux. Fais attention! ;-P



14
votes

Tout d'abord - si c'est un paramètre de sortie, vous ne pouvez pas utiliser .addwithvalue code> dans C # - Vous devez utiliser:

SqlParameter outparam = cmd.Parameters.Add("@guidid",SqlDbType.UniqueIdentifier);
outparam.Direction = ParameterDirection.Output;

cmd.Parameters.AddWithValue("@sname", "mehdi");

cmd.ExecuteNonQuery();

Guid newlyInsertedID = new Guid(cmd.Parameters["@guidid"].Value);
MessageBox.Show(newlyInsertedID.ToString());


0 commentaires

0
votes

Pourquoi définissez-vous la sortie @Guidid UnicalIdentifier sous forme de paramètre de sortie? Cela signifie qu'il le remplacera une fois que vous exécutez la procédure stockée. Si c'est votre intention, vous devez ajouter une instruction après l'instruction insertion pour définir le paramètre de sortie sur la valeur souhaitée. Quelque chose comme ceci: Sélectionnez @Guidid = @generatedID. Oui, regardez le code Marc_s, c'est ainsi que vous êtes censé le faire.


0 commentaires

0
votes

J'ai aussi trouvé cela très frustrant et je ne pouvais pas comprendre le problème. Bien que de nombreuses réponses soient correctes, il y avait une ligne simple qui était souvent négligée par moi et d'autres, à savoir que le commandement doit être de la procédure de stockage non seulement de SQL avec des paramètres, donc j'espère que cela aide:

      using (SqlCommand cmd= new SqlCommand())
      {
           cmd.Text= ...;
           cmd.CommandType = CommandType.StoredProcedure;
           SqlParameter outParam = cmd.Parameters.Add("@guidid", SqlDbType.Uniqueidentifier);
           outParam.Direction = ParameterDirection.Output;

           using (var connection = new SqlConnection(this.myConnectionString))
           {
            connection.Open();
            cmd.Connection = connection;

            try
            {
                cmd.ExecuteNonQuery();
            }
            catch
            {
             //    put your sql catches etc. here..
              throw;
            }  
          }  
       var outValue = outParam.Value; 
       //query outValue e.g. ToString()   
       }


0 commentaires