none
Busca com mais de um parâmetro RRS feed

  • Pergunta

  • Estou criando uma busca que tem um formulario com 3 campos (situacao, responsavel, hospital). A ideia é que o usuário possa digitar os 3 ou somente 1 dos campos.

    Como ficaria a clausula where?

    Tentei algo como:

    string where = "";
    
                if (situacao!="")
                {
                    where += "and situacaoDesejada like '%" + situacao + "%'";
                }
    
                if (hospital != "")
                {
                    where += "and hospital like '%" + hospital + "%'";
                }
                if (responsavel != "")
                {
                    where += "and responsavel like '%" + responsavel + "%'";
                }

    O problema é que com esse codigo, quando o usuário digita mais de um campo a clausula where ficaria com um AND no começo (select * from tabela where AND situacao=xxx and hospital=xxx and responsavel=xxx).

    Existe alguma abordagem melhor para implementar a consulta?

    Obrigado



    sexta-feira, 21 de fevereiro de 2014 16:58

Respostas

  • Olá existe alguns modos de se fazer isso ! primeiro eu usaria parametros para evitar injecao de sql ! 

    mas nessa logica que vc fez conseguimos ajeitar pra mais ou menos assim :

    var strings = new List<string>();
    
    if(hospital != "")
        strings.Add(hospital);
    if(......
        strings.Add(situacao);
    ......
    
    //no where
    string where = string.Empty;
    
    int count = 0;
    foreach(var item in strings)
     {
       if(count == 0)
          where = item +"like %....;
       else
         where += "AND " + item + "like.....";
       count++;
    }
    Assim funciona mas use parametros.


    • Marcado como Resposta Rodrigo Calado sábado, 22 de fevereiro de 2014 14:46
    sexta-feira, 21 de fevereiro de 2014 17:09

Todas as Respostas

  • Olá existe alguns modos de se fazer isso ! primeiro eu usaria parametros para evitar injecao de sql ! 

    mas nessa logica que vc fez conseguimos ajeitar pra mais ou menos assim :

    var strings = new List<string>();
    
    if(hospital != "")
        strings.Add(hospital);
    if(......
        strings.Add(situacao);
    ......
    
    //no where
    string where = string.Empty;
    
    int count = 0;
    foreach(var item in strings)
     {
       if(count == 0)
          where = item +"like %....;
       else
         where += "AND " + item + "like.....";
       count++;
    }
    Assim funciona mas use parametros.


    • Marcado como Resposta Rodrigo Calado sábado, 22 de fevereiro de 2014 14:46
    sexta-feira, 21 de fevereiro de 2014 17:09
  • Rodrigo vc poderia colocar no where uma clausula que não fosse uma dessas, caso não tenha pode usar "where 1=1 and .." não é elegante mais resolve  e nos seus if vc tiraria o "where".

     

    Junior

    sexta-feira, 21 de fevereiro de 2014 17:16
  • Olá Rodrigo, não aconselho montagem de comandos concatenando strings, você terá que tratar questões de segurança já disseminadas e muito quando se refere a este tipo de uso.
    Utilize DBCommand e DBParameter's.

    Sugiro você refazer seu algoritmo para  deixar o comando mais ou menos desta forma:
    sql="select .... from .... where @param1 like '%@value1%' ..."

    Veja este link:
    http://stackoverflow.com/questions/7113667/creating-dynamic-sql-dbparameter-values

    Tem até uns métodos que te ajudaria na montagem do seu algoritmo.

    Falou!


    ---- Ajudou? Marque como útil! :D

    sexta-feira, 21 de fevereiro de 2014 19:18
  • Implementei desta forma pra ver funcionar e deu tudo certo.!!
    O proximo passo é implementar usando parâmetros.

    private string montaCondicao(string situacao, string responsavel, string hospital)
            {
    
    
            var strings = new List<string>();
                if (hospital != "")
                {
                    strings.Add("hospital like '%" + hospital + "%'");
                }
                if (situacao!="")
                {
                    strings.Add("situacaoDesejada like '%" + situacao + "%'");
                }
                if (responsavel!="")
                {
                    strings.Add("responsavel like '%" + responsavel + "%'");
                }
    
                string where = string.Empty;
    
                int count = 0;
                foreach (var item in strings)
                {
                    if (count==0)
                    {
                        where = item;
                        count++;
                    }
                    else
    	            {
                        where += " and " + item;
                        count++;
    	            }
                   
                }
                          
                return where;
            }

    sábado, 22 de fevereiro de 2014 14:50