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ídaoutput.
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
- O nome do parâmetro deve ser obrigatoriamente a string fixa
ReturnValue, não pode usar nome personalizado Direction = ParameterDirection.ReturnValue- Nos procedimentos armazenados do SQL Server, o comando
return valorsó aceita dados do tipo int - 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étodo | Conteúdo retornado | Cenários de utilização |
|---|---|---|
| ExecuteReader | SqlDataReader (várias linhas em fluxo) | Consultar múltiplos registros |
| SqlDataAdapter.Fill | DataSet/DataTable (tabela offline) | Ligar tabelas aos controles WinForm |
| ExecuteScalar | object (primeira coluna da primeira linha) | Quando se precisa apenas de um resultado agregado |
| ExecuteNonQuery | int(linhas afetadas)+valor ReturnValue | Incluir / atualizar / excluir, quando precisar de código de status do procedimento |
Procedimento armazenado Return
Previous: SqlDataAdapter