1. Descripción del método
SqlCommand.ExecuteNonQuery()
Casos de uso: INSERT (insertar), UPDATE (actualizar), DELETE (eliminar). No lo utilices para consultas SELECT
Valor devuelto: tipo int, representa el número de filas afectadas tras ejecutar la sentencia SQL
Funcionamiento: cuando la base de datos ejecuta sentencias DML, devuelve la cantidad de filas modificadas. La aplicación lee este valor para comprobar si la operación surtió efecto.
Lógica de negocio según el valor devuelto
- INSERT: inserción correcta → devuelve
1; si falla se lanza una excepción; - UPDATE:
- Se encuentran registros coincidentes y se modifican → devuelve ≥1
- No hay registros que cumplan la condición
WHERE→ devuelve0(la sentencia se ejecuta sin errores, pero no se actualiza ninguna fila)
- DELETE:
- Se eliminan registros coincidentes → devuelve ≥1
- No existen registros coincidentes → devuelve
0
Diferencia importante: devolver 0 no equivale a un error del programa. La sintaxis SQL se ejecuta sin problemas, simplemente no hay registros que cumplan las condiciones para ser modificados.
Ejemplo de inserción INSERT
private void button2_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=.;Initial Catalog=db;Integrated Security=True";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
// SQL parametrizado para evitar inyección SQL
sqlCom.CommandText = "INSERT INTO [dbo].[Article]([Title]) VALUES(@Title)";
sqlCom.CommandTimeout = 60;
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "Este es un nuevo título" + DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());
// Si la inserción funciona res=1
}
}Lenguaje del código: JavaScript (javascript)
Ventaja: consultas parametrizadas, evitan vulnerabilidades por inyección SQL generadas al concatenar cadenas de texto.
Ejemplo de actualización UPDATE
conn.Open();
SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = conn;
sqlCom.CommandText = "UPDATE [dbo].[Article] SET [Title] = @Title WHERE id = @id";
sqlCom.CommandTimeout = 60;
SqlParameter param = new SqlParameter("@Title", SqlDbType.NVarChar, 250);
param.Value = "Este es un nuevo título"+DateTime.Now;
param.Direction = ParameterDirection.Input;
sqlCom.Parameters.Add(param);
// Dos formas equivalentes de agregar parámetros
//Forma 1: crear el objeto y luego añadirlo
SqlParameter param2 = new SqlParameter("@id", SqlDbType.Int);
param2.Value = 5;
sqlCom.Parameters.Add(param2);
//Forma 2: inicialización encadenada (versión comentada en el código)
//sqlCom.Parameters.Add(new SqlParameter("@id", SqlDbType.Int){Value=5});
int res = sqlCom.ExecuteNonQuery();
MessageBox.Show(res.ToString());Lenguaje del código: JavaScript (javascript)
- Existe el registro con
id=5en la tabla →res=1 - No existe el registro con
id=5→res=0
Así puedes evaluarlo en tu lógica de negocio:
if(res > 0)
{
MessageBox.Show("Actualización completada");
}
else
{
MessageBox.Show("No se encontró el registro objetivo, no se realizó ninguna actualización");
}Lenguaje del código: JavaScript (javascript)
Notas importantes
- No confirmes el éxito solo por la ausencia de excepciones
Que SQL no lance errores no significa que se modificaron los datos. Por ejemplo, si no coincide ninguna fila con los criterios de actualización devuelve 0. Siempre valida el resultado con el número de filas afectadas. - No uses
ExecuteNonQuerypara sentencias SELECT
Al ejecutar SELECT solo devuelve-1y no obtienes los datos consultados. Para leer registros usaExecuteReader()/ExecuteScalar(). - Ventaja de la sintaxis using
using(SqlConnection conn)libera automáticamente la conexión de base de datos al finalizar el bloque y evita fugas de conexión. - Los nombres de parámetros deben coincidir exactamente
Dentro de la sentencia SQL,@Titley@iddeben coincidir con los nombres definidos enSqlParameter. No distingue mayúsculas y minúsculas, pero el nombre no puede ser distinto.
Comparación de los tres métodos de SqlCommand
| Método | Propósito | Valor devuelto |
|---|---|---|
| ExecuteNonQuery | Insertar / Modificar / Eliminar (INSERT/UPDATE/DELETE) | int Número de filas afectadas |
| ExecuteScalar | Consultar una sola fila y columna (ej: COUNT, obtener ID autoincremental) | object Valor de la primera fila y primera columna |
| ExecuteReader | Consultas SELECT de múltiples filas y columnas | SqlDataReader flujo de datos |
ExecuteNonQuery