Udocs.me

Aplicativos patrocinadores


Autor: Mauricio Junior
Publicado em: 12/29/2014 2:10:25 PM

C# e SELECT sem acento

        Olá caro(a) leitor(a), hoje eu vou falar e mostrar como fazer SELECT no banco de dados desprezando o acento nas palavras buscadas. Todos sabem que o Português é uma língua rica em acentos e as vezes pessoas digitam sem acento.

Se o seu site tem algum sistema de busca, o dado buscado não será encontrado, mas se for ignorado o acento, os dados aparecem na página. Eu vou mostrar o método em C# que mostra como buscar ou como construir a instrução para enviar ao banco de dados de forma dinâmica. 

Fazendo algumas pesquisas na Internet, percebi que alguns desenvolvedores não trabalham muito com banco de dados, eles se tornam especialistas na linguagem de software mas esquecem do banco de dados. Não importa qual o banco, o que importa é que você precisa entender e aprender a trabalhar com base de dados, fica a dica.

Utilizado:
Ferramenta Visual Studio Microsoft
Linguagem C#
Banco de dados SQL Server
SELECT no banco de dados

Eu não vou me extender muito por aqui no arquivo. Até porque eu já falei o que quero te mostrar aqui. A busca de uma palavra sem acento é mais fácil do que você imagina, veja o método que faz isso, logo abaixo.

internal DataTable searchFiltro(EmpresaDTO dto)
        {
            StringBuilder str = new StringBuilder();
            str.Append(@" 
                        SELECT
                       Distinct Categoria.NomeCategoria, Categoria.IdCategoria
                        FROM
                       Empresa 
                       INNER JOIN EmpresaCategoria
                       ON EmpresaCategoria.IdEmpresa = Empresa.IdEmpresa
                       INNER JOIN Categoria
                       ON Categoria.IdCategoria = EmpresaCategoria.IdCategoria
                        WHERE 1=1 AND Empresa.NomeFantasia COLLATE Latin1_General_CI_AI like @nomeFantasia ORDER BY Categoria.NomeCategoria ");
            

            SqlCommand dbCommand = new SqlCommand(str.ToString());
            dbCommand.CommandType = CommandType.Text;

            IDataParameter nomeFan = new SqlParameter();
            nomeFan.ParameterName = "@nomeFantasia";
            nomeFan.Value = "%" + dto.nomeFantasia + "%";
            nomeFan.DbType = System.Data.DbType.String;//System.Data.DbType.Guid;
            dbCommand.Parameters.Add(nomeFan);
           

            database.GetSourceConnection();
            return database.ExecutaDataSetParameter(dbCommand).Tables[0];
        }

Código 1.1 - Método que busca a palavra sem acento

Vou tentar te explicar o código 1.1.

Explicação:
Se você gosta de ler tudo de um artigo, note que eu começo com o nome internal. Isso mesmo, a assinatura do método é interno, retorna um DataTable e recebe uma classe EmpresaDTO (dto significa Data Transfer Object). Esta classe eu tenho várias propriedades que pode atribuir valores antes da instanciar a classe. Depois de atribuir eu mando para o método certo.

Utilizo depois o StringBuilder para colocar o SELECT com INNER JOIN. Nesse SELECT eu preciso buscar o nome da empresa que pode ter acento. Note o comando COLLATE Latin1_General_CI_AI, esse é o comando do banco de dados que ignora o acento gravado no campo NomeFantasia do banco de dados SQL Server. Depois do comando, eu coloquei outro comando LIKE @nomeFantasia.

O LIKE é um comando específico para buscar nomes não completos e o @nomeFantasia é o valor que será passado. Note que o “%” (porcento) foi colocado no valor do IDataParameter, isso evita o SQLInject.  O SqlCommand está no framework da Microsoft chamado System.Data.SqlClient e ele foi utilizado para colocar valores da StringBuilder.

Para passar os valores como parâmetro utilizei o IDataParameter do framework System.Data. Com ele, podemos adicionar o nome do parâmetro, valor e o tipo de dado. No nosso exemplo mostrado no código 1.1, o tipo do dado é String, o valor está dentro do DTO e o parameterName é o mesmo nome colocado dentro da StringBuilder. No final, adiciono os valores ao SqlCommand criado anteriormente.

O método database.GetSourceConnection() conecta ao banco de dados para depois executar outro método que retorna um DataTable.

É bem simples o nosso caso mas eu decidi escrever para mostrar aos desenvolvedores a melhor maneira de fazer um SELECT e método que busca palavras sem acento com segurança do LIKE.

Espero que tenha gostado e qualquer dúvida pode entrar em contato pelo site www.mauriciojunior.org







Revista ecode10 Magazine