ExecuteNonQuery

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

  1. INSERT: inserción correcta → devuelve 1; si falla se lanza una excepción;
  2. UPDATE:
  • Se encuentran registros coincidentes y se modifican → devuelve ≥1
  • No hay registros que cumplan la condición WHERE → devuelve 0 (la sentencia se ejecuta sin errores, pero no se actualiza ninguna fila)
  1. 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=5 en la tabla → res=1
  • No existe el registro con id=5res=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

  1. 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.
  2. No uses ExecuteNonQuery para sentencias SELECT
    Al ejecutar SELECT solo devuelve -1 y no obtienes los datos consultados. Para leer registros usa ExecuteReader() / ExecuteScalar().
  3. 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.
  4. Los nombres de parámetros deben coincidir exactamente
    Dentro de la sentencia SQL, @Title y @id deben coincidir con los nombres definidos en SqlParameter. No distingue mayúsculas y minúsculas, pero el nombre no puede ser distinto.

Comparación de los tres métodos de SqlCommand

MétodoPropósitoValor devuelto
ExecuteNonQueryInsertar / Modificar / Eliminar (INSERT/UPDATE/DELETE)int Número de filas afectadas
ExecuteScalarConsultar una sola fila y columna (ej: COUNT, obtener ID autoincremental)object Valor de la primera fila y primera columna
ExecuteReaderConsultas SELECT de múltiples filas y columnasSqlDataReader flujo de datos

ExecuteNonQuery

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *