En esta sección se muestra cómo llamar procedimientos almacenados con ADO.NET: usar ExecuteNonQuery para obtener el número de filas afectadas y capturar al mismo tiempo el valor devuelto por Return del procedimiento almacenado.
1. Definición del procedimiento almacenado de base de datos
create procedure mynewproc(@id int)
as
begin
declare @cout int
-- Sentencia de actualización
update Article set title = '111' where id = @id
-- Contar registros con id mayor al parámetro de entrada
select @cout = count(1) from Article where id > @id
-- return devuelve valor numérico (en SQL Server return solo admite tipo int)
return @cout
endLenguaje del código: PHP (php)
Importante:
return @coutes el valor devuelto del procedimiento almacenado, distinto al parámetro de salidaoutput.
2. Llamada desde 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;
// 【Clave】Registrar parámetro para valor Return, nombre fijo 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 del procedimiento almacenado @id
SqlParameter param = new SqlParameter("@id", SqlDbType.Int, 8);
param.Value = 4;
param.Direction = ParameterDirection.Input;
command.Parameters.Add(param);
// ExecuteNonQuery: ejecuta insert/update/delete, devuelve 【filas afectadas por update】
int rowsAffected = command.ExecuteNonQuery();
// Leer el valor traído por return del procedimiento almacenado
int result = (int)command.Parameters["ReturnValue"].Value;
}Lenguaje del código: PHP (php)
Forma recomendada de escribirlo
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 (nombre fijo: ReturnValue, dirección obligatoria ReturnValue)
cmd.Parameters.Add("ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
// Parámetro de entrada
cmd.Parameters.Add("@id", SqlDbType.Int).Value = 4;
// rowsAffected = cantidad de registros modificados por la sentencia update
int rowsAffected = cmd.ExecuteNonQuery();
// Obtener el valor return @cout del procedimiento almacenado
int procReturnVal = (int)cmd.Parameters["ReturnValue"].Value;
}Lenguaje del código: JavaScript (javascript)
Observaciones
1. int rowsAffected = command.ExecuteNonQuery();
- Significado: número de filas afectadas por sentencias DML (update/delete/insert)
- En este ejemplo: cantidad de registros coincidentes y modificados por
update Article set title='111' where id=@id - No es el valor devuelto por return del procedimiento almacenado. Ambos son totalmente independientes
2. Parámetro de retorno ReturnValue
- El nombre del parámetro debe ser obligatoriamente la cadena fija
ReturnValue, no se puede personalizar Direction = ParameterDirection.ReturnValue- En procedimientos almacenados de SQL Server,
return valorsolo trabaja con tipo int - Solo se puede leer el valor después de ejecutar
ExecuteNonQuery()
- Valor
return: solo uno permitido, tipo int exclusivamente- Parámetro
output: se pueden definir varios, admite múltiples tipos de datos
Diferencias
-- Dentro del procedimiento almacenado
update Article set title='111' where id=4; -- Supongamos que modifica una fila
return 10; -- valor devuelto por returnLenguaje del código: PHP (php)
Después de ejecutar:
rowsAffected = 1(filas afectadas por update)procReturnVal = 10(valor traído por return)
Resumen
| Método | Contenido devuelto | Casos de uso |
|---|---|---|
| ExecuteReader | SqlDataReader (varias filas en streaming) | Consultar múltiples registros |
| SqlDataAdapter.Fill | DataSet/DataTable (tabla sin conexión) | Vincular tablas para controles WinForm |
| ExecuteScalar | object (primera columna de la primera fila) | Cuando solo necesitas un resultado agregado |
| ExecuteNonQuery | int(filas afectadas)+valor ReturnValue | Insertar / actualizar / borrar, cuando se requiere código de estado del procedimiento |
Procedimiento almacenado Return
Previous: SqlDataAdapter