Principales respuestas
Como pasar parámetros a PostgreSQL

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ú
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ú- Marcado como respuesta Joyce_ACModerator martes, 10 de enero de 2017 16:09
Todas las respuestas
-
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);
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
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ú
- Editado Pedro Ávila lunes, 9 de enero de 2017 19:03 ...
-
¿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. -
@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ú -
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. -
-
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 -
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ú- Marcado como respuesta Joyce_ACModerator martes, 10 de enero de 2017 16:09