Os outros shows de resposta isto, mas, essencialmente, você só precisa criar um SqlParameter
, definir o Direction
que Output
, e adicioná-lo ao SqlCommand
's Parameters
coleção. Em seguida, execute o procedimento armazenado e obtenha o valor do parâmetro.
Usando seu exemplo 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();
}
Tenha cuidado ao obter o Parameters[].Value
, uma vez que o tipo precisa ser convertido object
para o que você está declarando. E o SqlDbType
usado quando você cria as SqlParameter
necessidades para corresponder ao tipo no banco de dados. Se você vai apenas Parameters["@Param"].Value.ToString()
enviá- lo para o console, pode apenas usar (explicitamente ou implicitamente por meio de um Console.Write()
ouString.Format()
chamada ).
EDITAR: Mais de 3,5 anos e quase 20 mil visualizações e ninguém se preocupou em mencionar que ele nem mesmo compilou pelo motivo especificado no meu comentário "tenha cuidado" no post original. Agradável. Corrigido com base em bons comentários de @Walter Stabosz e @Stephen Kennedy e para corresponder à edição do código de atualização na pergunta de @abatishchev.
conn.Close()
porque está dentro de umusing
blocoPara quem deseja fazer algo semelhante usando um leitor com o procedimento armazenado, observe que o leitor deve ser fechado para recuperar o valor de saída.
fonte
Não é meu código, mas um bom exemplo, eu acho
fonte: http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=624
fonte
Fonte http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output
fonte
fonte
Você pode obter seu resultado pelo código abaixo:
fonte
Crie o SqlParamObject que lhe daria controle para acessar métodos nos parâmetros
:
DEFINA o nome do seu parâmetro (deve ser o mesmo que você declararia uma variável para conter o valor em seu banco de dados)
:
param.ParameterName = "@yourParamterName";
Limpe o titular do valor para manter seus dados de saída
:
param.Value = 0;
Defina a direção de sua escolha (no seu caso, deve ser saída)
:
param.Direction = System.Data.ParameterDirection.Output;
fonte
Isso parece mais explícito para mim:
fonte