none
Problema al realizar busqueda en sql desde c# RRS feed

  • Pregunta

  • Buenas a todos, vengo con una duda que espero y me puedan resolver, lo que pasa es lo siguiente, tengo una base de datos con un campo nombre donde almaceno un nombre completo, por ejemplo Paco Perez Gonzalez, y lo que quiero es que pueda buscar ya sea Paco, Perez o Gonzalez y el comando que yo tengo me busca todo incluyendo espacios, entonces al escribir "Paco" lo busca pero al borrarlo detecta que Nombre = " ", entonces en el campo busca " " y me muestra a todos ya que entre cada nombre y apellido se encuentra un espacio

    private void TBAlumno_TextChanged(object sender, EventArgs e)
            {
                Nombre = TBAlumno.Text;
                StringComando = "Select * FROM Alumnos WHERE Nombre like '%" + Nombre + "%'";
                BuscarTB();
            }
    
            private void BuscarTB()
            {
                try
                {
                    //string Tabla = TBAlumno.Text;
                    SqlConnection Conexion = MiConexion.ObtenerConexion();
                    SqlCommand Comando = MiConexion.ObtenerComando();
                    Comando.CommandText = StringComando;//"Select * FROM Alumnos WHERE GRUPO = '" + Tabla + "'";
                    Comando.Connection = Conexion;
                    SqlDataAdapter DataAdapt = new SqlDataAdapter(Comando);
                    DataTable DatosTabla = new DataTable();
                    DataAdapt.Fill(DatosTabla);
                    dataGridView1.DataSource = DatosTabla;
                    Comando.ExecuteNonQuery();
                    Conexion.Close();
                }
                catch
                {
                    //MessageBox.Show("No existe la tabla");
                }
            }
            string Nombre;
            string StringComando;

    sábado, 10 de marzo de 2018 2:18

Respuestas

  • Efectivamente, si el nombre está vacío entonces el "...like '%"+Nombre+"%'" se convierte en "...like '%%'", y ese "like" lo cumplen todos los registros.

    El remedio más evidente es "no hacerlo", es decir, compara el nombre a ver si lo han dejado vacío y en ese caso no hagas la búsqueda.

    Pero si no obstante te empeñas en llamar al SQL aunque esté vacío y no quieres que te devuelva todos, puedes añadir un "AND" en la sentencia para filtrar ese caso:

      StringComando = "Select * FROM Alumnos WHERE Nombre like '%" + Nombre + "%' AND '" + Nombre.Trim() + "'<>''";

    Por cierto, dicho lo anterior, merece la pena volver a señalar, como siempre lo hacemos en los foros, que es una pésima costumbre concatenar en una sentencia SQL un dato introducido por un usuario. En su lugar, se debe parametrizar la sentencia y meter el valor en el parámetro. No te pongo un ejemplo porque sobre este tema se han vertido ya ríos de tinta, y hay miles del ejemplos en la Red y en los foros.

    • Propuesto como respuesta osrol sábado, 10 de marzo de 2018 11:39
    • Marcado como respuesta FelixElGato17 sábado, 10 de marzo de 2018 14:44
    sábado, 10 de marzo de 2018 9:51
    Moderador

Todas las respuestas

  • Efectivamente, si el nombre está vacío entonces el "...like '%"+Nombre+"%'" se convierte en "...like '%%'", y ese "like" lo cumplen todos los registros.

    El remedio más evidente es "no hacerlo", es decir, compara el nombre a ver si lo han dejado vacío y en ese caso no hagas la búsqueda.

    Pero si no obstante te empeñas en llamar al SQL aunque esté vacío y no quieres que te devuelva todos, puedes añadir un "AND" en la sentencia para filtrar ese caso:

      StringComando = "Select * FROM Alumnos WHERE Nombre like '%" + Nombre + "%' AND '" + Nombre.Trim() + "'<>''";

    Por cierto, dicho lo anterior, merece la pena volver a señalar, como siempre lo hacemos en los foros, que es una pésima costumbre concatenar en una sentencia SQL un dato introducido por un usuario. En su lugar, se debe parametrizar la sentencia y meter el valor en el parámetro. No te pongo un ejemplo porque sobre este tema se han vertido ya ríos de tinta, y hay miles del ejemplos en la Red y en los foros.

    • Propuesto como respuesta osrol sábado, 10 de marzo de 2018 11:39
    • Marcado como respuesta FelixElGato17 sábado, 10 de marzo de 2018 14:44
    sábado, 10 de marzo de 2018 9:51
    Moderador
  • Muchas gracias me ha funcionado y si introduzco los datos mediante parametros pero ahorita estaba haciendo pruebas con esa parte del codigo, muchas gracias por tu ayuda

    sábado, 10 de marzo de 2018 14:47
  • Disculpa como lo puedo hacer con parametros?

    "Select * FROM Alumnos WHERE Nombre like '%@nombre%' AND '??????' <>''"




    sábado, 10 de marzo de 2018 14:51
  • En SQL Server es lícito usar el mismo parámetro dos veces en la misma sentencia. Pero no tienes bien hecha la concatenación de los símbolos de "%", y además cuando se parametriza el parámetro no va entre comillas:

    "Select * FROM Alumnos WHERE Nombre like '%'+@nombre+'%' AND @nombre<>''"

    sábado, 10 de marzo de 2018 16:13
    Moderador