J'ai une procédure stockée: 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());
5 Réponses :
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é . P>
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());
Il devrait être
Cela semble contagieux. Fais attention! ;-P
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());
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. P>
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() }
Est-ce que le SP réellement définit i>
@guidid code>? Je suis plutôt la commande isnull uniquement retourne i> la valeur de
newid () code> tandis que
@guidid code> conserverait la valeur qu'il a dû commencer.