none
Se puede poner un ExecuteNonQuery() en un if RRS feed

  • Pregunta

  • Muy buen día a todos, espero me puedan ayudar, estoy haciendo una conexión de C# con SQL Server y me estoy basando en un tutorial de VB, el problema es que no puedo eliminar un error en donde utiliza un ExecuteNonQuery() dentro de un if, esto es con la finalidad de poder eliminar campos de la base de datos desde el formulario de C# por medio de métodos almacenados, entonces por el momento se generan dos clases una llamada Funciones y una Propiedades y en la que tengo problemas en la de Funciones, adjunto código muchas gracias por su tiempo.

    sing System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace GYM
    {
        class Propiedades
        {
            private string _Numero;
            private string _Clave;
            private string _Producto;
            private int _Existencia;
            private double _Precio;
            private DateTime _Fecha;
    
            public string _numero
            {
                get
                {
    
                    return _Numero;
                }
                set
                {
                    _Numero = value;
                }
            }
            public string _clave
            {
                get
                {
    
                    return _Clave;
                }
                set
                {
                    _Clave = value;
                }
            }
            public string _producto
            {
                get
                {
    
                    return _Producto;
                }
                set
                {
                    _Producto= value;
                }
            }
            public int _existencia
            {
                get
                {
    
                    return _Existencia;
                }
                set
                {
                    _Existencia = value;
                }
            }
            public double _precio
            {
                get
                {
    
                    return _Precio;
                }
                set
                {
                    _Precio = value;
                }
            }
            public DateTime _fecha
            {
                get
                {
    
                    return _Fecha;
                }
                set
                {
                    _Fecha = value;
                }
            }
        }
    }

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace GYM
    {
        class Funciones
        {
            private string cadena = "Data Source = DESKTOP-A0SQ0MF; Initial Catalog = PV; Integrated Security=True";
            public bool Eliminar_Producto(Propiedades data)
            {
                using (SqlConnection cn = new SqlConnection(cadena))
                {
                    string sql = "SELECT Número,Clave,Producto,Existencia,Precio,Fecha FROM Productos";
                    SqlCommand cmd = new SqlCommand(sql, cn);
                    try
                    {
                        cn.Open();
                        cmd = new SqlCommand("SP_EliminarProducto", cn);
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.AddWithValue("@CodProd", data._clave);
                        if (cmd.ExecuteNonQuery())
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    catch
                    {
                        Console.Write("Sin Comexion");
                        return false;
                    }
                    
                }
            }
        }
    }


    jueves, 19 de septiembre de 2019 0:30

Todas las respuestas

  • Sí que se puede poner el ExecuteNonQuery dentro de un "if". Lo que no puedes hacer es tomar directamente el resultado del ExecuteNonQuery, que siempre es de tipo int y pasárselo directamente al "if", que espera un bool.

    Por ejemplo, puedes hacer esto:

    if (cmd.ExecuteNonQuery() == 0)

    Recuerda que lo que devuelve el ExecuteNonQuery es el número de filas afectadas, y por eso siempre es un int. NO devuelve el resultado que devuelvas con un "return" desde el SP.

    jueves, 19 de septiembre de 2019 6:03
  • hola

    si revisas la documentacion

     SqlCommand.ExecuteNonQuery Method

    menciona que retorna las rows afectadas, o sea es un valor numerico

    puedes usar este en un if, pero recomendaria sea indirecto, asi puedes inspeccionar que obtienes

     int rowsAffected = cmd.ExecuteNonQuery();
    
     if (rowsAffected > 0){
    
        return true;
    
    }


    aunque si la idea es devolver un bool podrias usar directo

    int rowsAffected = cmd.ExecuteNonQuery();
    
    return rowsAffected > 0;


    en una sola linea sin ningun if

    Igual una aclaracion, con un SELECT no se usa el ExecuteNonQuery() deberias usar el ExecuteReader, ExecuteScalar() o por medio del SqlDataAdapter realizar el fill de un datatable

    estas recuperando datos, el ExecuteNonQuery deberias aplicarlo cuando sea un INSERT, UPDATE o DELETE, no en un SELECT

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 19 de septiembre de 2019 11:30