none
Como pasar parámetros a PostgreSQL RRS feed

  • Pregunta

  • Tengo esta query, deseo pasarle parámetros para hacer un LIKE

    cmd.CommandText = @"SELECT idArticulo, descripcion FROM tblarticulos
                        WHERE ((IdArticulo IS NULL) OR (idarticulo LIKE @idarticulo))
                        AND ((Descripcion IS NULL) OR (descripcion LIKE @descripcion))";
    
                        cmd.Parameters.AddWithValue("@idarticulo", string.IsNullOrEmpty($"%{filter.Id}%")
                            ? (object)DBNull.Value
                            : filter.Id);
                        cmd.Parameters.AddWithValue("@descripcion", string.IsNullOrEmpty($"%{filter.Descripcion}%")
                            ? (object)DBNull.Value
                            : filter.Descripcion);

    El error que me da es el siguiente Parameter '@idarticulo' must have its value set

    Parameter '@idarticulo' must have its value set
    Parameter '@idarticulo' must have its value set
    Parameter '@idarticulo' must have its value set
    Parameter '@idarticulo' must have its value set

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 9 de enero de 2017 17:47

Respuestas

  • Solucionado

    public static IEnumerable<Articulo> SelectList(UniversalExtend filter)
            {
                using (var cn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
                {
                    cn.Open();
                    using (var cmd = cn.CreateCommand())
                    {
                        cmd.CommandText = "SELECT IdArticulo, Descripcion FROM tblarticulos" +
                        " WHERE (@IdArticulo IS NULL OR IdArticulo ILIKE @IdArticulo)" +
                        " AND (@Descripcion IS NULL OR Descripcion ILIKE @Descripcion)";
    
                        cmd.Parameters.AddWithValue("@idarticulo", NpgsqlDbType.Varchar, string.IsNullOrEmpty(filter.Id)
                            ? (object)DBNull.Value
                            : $"%{filter.Id}%");
                        cmd.Parameters.AddWithValue("@descripcion", NpgsqlDbType.Varchar, string.IsNullOrEmpty(filter.Descripcion)
                            ? (object)DBNull.Value
                            : $"%{filter.Descripcion}%");
    
                        var _articulo = new List<Articulo>();   
                        using (NpgsqlDataReader reader = cmd.ExecuteReader())
                        {
                            while(reader.Read())    
                            {
                                var a = new Articulo()
                                {
                                    IdArticulo = Convert.ToString(reader["idarticulo"]),
                                    Descripcion = Convert.ToString(reader["descripcion"])
                                };
                                _articulo.Add(a);
                            }
                        }
                        return _articulo.ToList();   
                    }
                }   
            }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 9 de enero de 2017 22:31

Todas las respuestas

  • si se revisa la doc

    9.4. String Functions and Operators

    la union de string para armarel like lo realzias con ||

    cmd.CommandText = @"SELECT idArticulo, descripcion FROM tblarticulos
                        WHERE ((IdArticulo IS NULL) OR (idarticulo LIKE '%' || @idarticulo || '%'))
                        AND ((Descripcion IS NULL) OR (descripcion LIKE '%' || @descripcion || '%'))";
    
    cmd.Parameters.AddWithValue("@idarticulo", string.IsNullOrEmpty(filter.Id)
    	? (object)DBNull.Value
    	: filter.Id);
    cmd.Parameters.AddWithValue("@descripcion", string.IsNullOrEmpty(filter.Descripcion)
    	? (object)DBNull.Value
    	: filter.Descripcion);

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 9 de enero de 2017 18:00
  • No me encuentra coincidencias de todas las maneras que he probado

    cmd.CommandText = @"SELECT idArticulo, descripcion FROM tblarticulos
                        WHERE ((IdArticulo IS NULL) OR (idarticulo LIKE @idarticulo))
                        AND ((Descripcion IS NULL) OR (descripcion LIKE @descripcion))";
    
                        cmd.Parameters.AddWithValue("@idarticulo", string.IsNullOrEmpty(filter.Id)
                            ? (object)DBNull.Value
                            : $"%{filter.Id}%");
                        cmd.Parameters.AddWithValue("@descripcion", string.IsNullOrEmpty(filter.Descripcion)
                            ? (object)DBNull.Value
                            : $"%{filter.Descripcion}%");
                        var _articulo = new List<Articulo>();
                        using (NpgsqlDataReader reader = cmd.ExecuteReader())
                        {
                            while(reader.Read())    
                            {
                                var a = new Articulo()
                                {
                                    IdArticulo = Convert.ToString(reader["idarticulo"]),
                                    Descripcion = Convert.ToString(reader["descripcion"])
                                };
                                _articulo.Add(a);
                            }
                        }
                        return _articulo.ToList();

    El reader me viene null

    using (NpgsqlDataReader reader = cmd.ExecuteReader())


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    lunes, 9 de enero de 2017 18:57
  • Pedro Ávila,

    ¿Has realizado los cambios propuestos por Leandro?

    El wilcard '%' es parte de la expresión condicional que define el predicado LIKE, no deberías enviarlo como parte del valor.

    Intenta realizar los cambios sugeridos por Leandro y coméntanos como te fue.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 9 de enero de 2017 19:01
  • @Willams

    hice los combios que me sugerio Leandro pero el reader viene null no entra a cargarme los datos por que supuestamente no hay considencias en la base de datos o la otra el problema es que siempre entre al else en la condicion de dbnull 

    using (var cn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
                {
                    cn.Open();
                    using (var cmd = cn.CreateCommand())
                    {
                        cmd.CommandText = "SELECT idArticulo, descripcion FROM tblarticulos" +
                        " WHERE ((idarticulo IS NULL) OR (idarticulo LIKE '%' || @idarticulo || '%'))" +
                        " AND ((descripcion IS NULL) OR (descripcion LIKE '%' || @descripcion || '%'))";
    
                        cmd.Parameters.AddWithValue("@idarticulo", string.IsNullOrEmpty(filter.Id)
                            ? (object)DBNull.Value
                            : filter.Id);
                        cmd.Parameters.AddWithValue("@descripcion", string.IsNullOrEmpty(filter.Descripcion)
                            ? (object)DBNull.Value
                            : filter.Descripcion);
                        var _articulo = new List<Articulo>();
                        using (NpgsqlDataReader reader = cmd.ExecuteReader())
                        {
                            while(reader.Read())    
                            {
                                var a = new Articulo()
                                {
                                    IdArticulo = Convert.ToString(reader["idarticulo"]),
                                    Descripcion = Convert.ToString(reader["descripcion"])
                                };
                                _articulo.Add(a);
                            }
                        }
                        return _articulo.ToList();   
                    }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 9 de enero de 2017 19:40
  • Pedro Ávila,

    Nota que la expresión que define el filtro en la consulta nunca valida cuando el parámetro es NULL, realiza el siguiente cambio:

    cmd.CommandText = @"SELECT idArticulo, descripcion FROM tblarticulos
    			WHERE ((@idarticulo IS NULL) OR (idarticulo LIKE '%' || @idarticulo || '%'))
                            AND ((@descripcion IS NULL) OR (descripcion LIKE '%' || @descripcion || '%'))";


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 9 de enero de 2017 20:46
  • Manda error

    No se puede determinar el tipo de parametro $1


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 9 de enero de 2017 21:14
  • como que rel reder viene null ? eso no puede ser, a lo sumo no tendra ningun registro porque el Read() sale del while

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 9 de enero de 2017 22:01
  • Solucionado

    public static IEnumerable<Articulo> SelectList(UniversalExtend filter)
            {
                using (var cn = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
                {
                    cn.Open();
                    using (var cmd = cn.CreateCommand())
                    {
                        cmd.CommandText = "SELECT IdArticulo, Descripcion FROM tblarticulos" +
                        " WHERE (@IdArticulo IS NULL OR IdArticulo ILIKE @IdArticulo)" +
                        " AND (@Descripcion IS NULL OR Descripcion ILIKE @Descripcion)";
    
                        cmd.Parameters.AddWithValue("@idarticulo", NpgsqlDbType.Varchar, string.IsNullOrEmpty(filter.Id)
                            ? (object)DBNull.Value
                            : $"%{filter.Id}%");
                        cmd.Parameters.AddWithValue("@descripcion", NpgsqlDbType.Varchar, string.IsNullOrEmpty(filter.Descripcion)
                            ? (object)DBNull.Value
                            : $"%{filter.Descripcion}%");
    
                        var _articulo = new List<Articulo>();   
                        using (NpgsqlDataReader reader = cmd.ExecuteReader())
                        {
                            while(reader.Read())    
                            {
                                var a = new Articulo()
                                {
                                    IdArticulo = Convert.ToString(reader["idarticulo"]),
                                    Descripcion = Convert.ToString(reader["descripcion"])
                                };
                                _articulo.Add(a);
                            }
                        }
                        return _articulo.ToList();   
                    }
                }   
            }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 9 de enero de 2017 22:31