Procedimento armazenado Return

Esta seção demonstra a chamada de procedimentos armazenados com ADO.NET: usar o ExecuteNonQuery para pegar o número de linhas afetadas e, ao mesmo tempo, ler o valor retornado pelo Return do procedimento armazenado.

1. Definição do procedimento armazenado do banco de dados

create procedure mynewproc(@id int)
as
begin
    declare @cout int
    -- Comando de atualização
    update Article set title = '111' where id = @id
    -- Contar registros onde o id é maior que o parâmetro recebido
    select @cout = count(1) from Article where id > @id
    -- return retorna valor numérico (no SQL Server o return só aceita tipo int)
    return @cout
endCode language: PHP (php)

Ponto‑chave: return @cout é o valor de retorno do procedimento armazenado, ele é diferente do parâmetro de saída output.

2. Chamada dentro do C#

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand("mynewproc", connection);
    command.CommandType = CommandType.StoredProcedure;

    // 【Importante】Registrar parâmetro do Return, nome fixo ReturnValue
    SqlParameter para = new SqlParameter(
        "ReturnValue",
        SqlDbType.Int,
        4,
        ParameterDirection.ReturnValue,
        false,0,0,string.Empty,DataRowVersion.Default,null);
    command.Parameters.Add(para);

    // Parâmetro de entrada do procedimento armazenado @id
    SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
    param.Value = 4;
    param.Direction = ParameterDirection.Input;
    command.Parameters.Add(param);

    // ExecuteNonQuery: executa insert/update/delete, retorna 【número de linhas afetadas pelo update】
    int rowsAffected = command.ExecuteNonQuery();
    // Recuperar o valor trazido pelo return do procedimento armazenado
    int result = (int)command.Parameters["ReturnValue"].Value;
}Code language: PHP (php)

Forma recomendada

string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=SSPI;";
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("mynewproc", conn))
{
    conn.Open();
    cmd.CommandType = CommandType.StoredProcedure;

    // Registrar parâmetro de retorno (nome fixo: ReturnValue, direção obrigatória ReturnValue)
    cmd.Parameters.Add("ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
    // Parâmetro de entrada
    cmd.Parameters.Add("@id", SqlDbType.Int).Value = 4;

    // rowsAffected = quantos registros foram alterados pelo comando update
    int rowsAffected = cmd.ExecuteNonQuery();
    // Pegar o valor return @cout vindo do procedimento armazenado
    int procReturnVal = (int)cmd.Parameters["ReturnValue"].Value;
}Code language: JavaScript (javascript)

Observações importantes

1. int rowsAffected = command.ExecuteNonQuery();
  • Significado: quantidade de linhas afetadas por comandos DML (update/delete/insert)
  • Neste exemplo: número de registros encontrados e modificados por update Article set title='111' where id=@id
  • Não é o valor retornado pelo return do procedimento armazenado. Os dois são totalmente independentes
2. Parâmetro de retorno ReturnValue
  1. O nome do parâmetro deve ser obrigatoriamente a string fixa ReturnValue, não pode usar nome personalizado
  2. Direction = ParameterDirection.ReturnValue
  3. Nos procedimentos armazenados do SQL Server, o comando return valor só aceita dados do tipo int
  4. Só é possível ler o valor desse parâmetro depois de rodar o ExecuteNonQuery()

  • Valor return: apenas um valor permitido, só aceita tipo int
  • Parâmetro output: pode‑se declarar vários, suporta diversos tipos de dados

Diferenças

-- Dentro do procedimento armazenado
update Article set title='111' where id=4; -- Supondo que altere uma linha
return 10; -- valor devolvido pelo returnCode language: PHP (php)

Após a execução:

  • rowsAffected = 1 (linhas afetadas pelo update)
  • procReturnVal = 10 (valor devolvido pelo return)

Resumo geral

MétodoConteúdo retornadoCenários de utilização
ExecuteReaderSqlDataReader (várias linhas em fluxo)Consultar múltiplos registros
SqlDataAdapter.FillDataSet/DataTable (tabela offline)Ligar tabelas aos controles WinForm
ExecuteScalarobject (primeira coluna da primeira linha)Quando se precisa apenas de um resultado agregado
ExecuteNonQueryint(linhas afetadas)+valor ReturnValueIncluir / atualizar / excluir, quando precisar de código de status do procedimento

Procedimento armazenado Return

Previous:

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *