Les autres spectacles de réponse, mais essentiellement il vous suffit de créer un SqlParameter
, réglez le Direction
à Output
, et l' ajouter à la SqlCommand
de Parameters
collection. Exécutez ensuite la procédure stockée et récupérez la valeur du paramètre.
En utilisant votre exemple de code:
// SqlConnection and SqlCommand are IDisposable, so stack a couple using()'s
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("sproc", conn))
{
// Create parameter with Direction as Output (and correct name and type)
SqlParameter outputIdParam = new SqlParameter("@ID", SqlDbType.Int)
{
Direction = ParameterDirection.Output
};
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(outputIdParam);
conn.Open();
cmd.ExecuteNonQuery();
// Some various ways to grab the output depending on how you would like to
// handle a null value returned from the query (shown in comment for each).
// Note: You can use either the SqlParameter variable declared
// above or access it through the Parameters collection by name:
// outputIdParam.Value == cmd.Parameters["@ID"].Value
// Throws FormatException
int idFromString = int.Parse(outputIdParam.Value.ToString());
// Throws InvalidCastException
int idFromCast = (int)outputIdParam.Value;
// idAsNullableInt remains null
int? idAsNullableInt = outputIdParam.Value as int?;
// idOrDefaultValue is 0 (or any other value specified to the ?? operator)
int idOrDefaultValue = outputIdParam.Value as int? ?? default(int);
conn.Close();
}
Soyez prudent lorsque vous récupérez le Parameters[].Value
, car le type doit être converti à partir object
de ce que vous déclarez. Et le SqlDbType
utilisé lorsque vous créez les SqlParameter
besoins pour correspondre au type dans la base de données. Si vous voulez simplement le sortir sur la console, vous utilisez peut-être simplement Parameters["@Param"].Value.ToString()
(explicitement ou implicitement via un appel Console.Write()
ou String.Format()
).
EDIT: Plus de 3,5 ans et près de 20k vues et personne n'avait pris la peine de mentionner qu'il n'a même pas été compilé pour la raison spécifiée dans mon commentaire "soyez prudent" dans le message original. Agréable. Correction du problème sur la base de bons commentaires de @Walter Stabosz et @Stephen Kennedy et pour correspondre à la modification du code de mise à jour dans la question de @abatishchev.
conn.Close()
car c'est à l'intérieur d'unusing
blocPour tous ceux qui cherchent à faire quelque chose de similaire à l'aide d'un lecteur avec la procédure stockée, notez que le lecteur doit être fermé pour récupérer la valeur de sortie.
la source
Pas mon code, mais un bon exemple je pense
source: http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=624
la source
Police http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output
la source
la source
Vous pouvez obtenir votre résultat par le code ci-dessous:
la source
Créez le SqlParamObject qui vous donnerait le contrôle pour accéder aux méthodes sur les paramètres
:
FIXER le nom de votre paramètre (il devrait être le même que vous auriez déclaré une variable pour contenir la valeur dans votre base de données)
:
param.ParameterName = "@yourParamterName";
Effacez le conteneur de valeur pour contenir vos données de sortie
:
param.Value = 0;
Définissez la direction de votre choix (dans votre cas, cela devrait être une sortie)
:
param.Direction = System.Data.ParameterDirection.Output;
la source
Cela me semble plus explicite:
la source