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
bloquePara cualquiera que busque hacer algo similar usando un lector con el procedimiento almacenado, tenga en cuenta que el lector debe estar cerrado para recuperar el valor de salida.
fuente
No es mi código, pero creo que es un buen ejemplo
fuente: http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=624
fuente
Fuente http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output
fuente
fuente
Puede obtener su resultado mediante el siguiente código:
fuente
Cree el SqlParamObject que le daría control para acceder a los métodos en los parámetros
:
ESTABLEZCA el nombre de su parámetro (debería ser el mismo que habría declarado una variable para mantener el valor en su base de datos)
:
param.ParameterName = "@yourParamterName";
Limpiar el contenedor de valor para guardar sus datos de salida
:
param.Value = 0;
Establezca la dirección de su elección (en su caso, debería ser Salida)
:
param.Direction = System.Data.ParameterDirection.Output;
fuente
Eso me parece más explícito:
fuente