La otra muestra de respuesta a esto, pero básicamente sólo tiene que crear una SqlParameter
, establecen el Direction
a Output
, y agregarlo a la SqlCommand
's Parameters
colección. Luego ejecute el procedimiento almacenado y obtenga el valor del parámetro.
Usando su ejemplo de código:
// 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();
}
Tenga cuidado al obtener el Parameters[].Value
, ya que el tipo debe convertirse desde el object
que lo está declarando. Y se SqlDbType
usa cuando crea las SqlParameter
necesidades para que coincidan con el tipo en la base de datos. Si solo va a Parameters["@Param"].Value.ToString()
enviarlo a la consola, es posible que solo esté usando (ya sea explícita o implícitamente a través de una llamada Console.Write()
o String.Format()
).
EDITAR: Más de 3.5 años y casi 20k visitas y nadie se había molestado en mencionar que ni siquiera se compiló por la razón especificada en mi comentario de "ten cuidado" en la publicación original. Agradable. Se corrigió en base a los buenos comentarios de @Walter Stabosz y @Stephen Kennedy y para que coincida con la edición del código de actualización en la pregunta de @abatishchev.
conn.Close()
ya que está dentro de unusing
bloque