none
Consulta com parametros RRS feed

  • Pergunta

  • Preciso fazer uma tela de consulta com parametros mas não estou conseguindo.

    EU tenho um formulario com:

    1 textbox para digitar o texto da pesquisa
    1 botao para realizar a pesquisa
    1 datagridview para exibir o resultado da pesquisa

    O que acontece é que só  é exibido o resultado da pesquisa se eu digitar no textbox EXATAMENTE como está no banco de dados, e eu gostaria que exibisse caso o usuário digitasse parte do nome na pesquisa

    EX: é um form de turmas onde tenho jardim I, jardim II, maternal, pré 1 e pré 2

    Só da certo a pesquisa se o usuário digitar o nome exato da turma no banco, pra exibir jardim I, tem que digitar jardim I .... eu gostaria que se o usuário digitasse "P" aparecesse todos os registros iniciados com "P", se digitasse "jar" ele apresentasse todos registros iniciados com "jar" .

    segue os códigos para análise

    STORED PROCEDURE NO BD

    ALTER PROCEDURE [dbo].[SelectTurmasByName] 
    @Turma varchar(50) 
    AS 
    BEGIN    
        SELECT * from Turmas 
        WHERE Turma = @Turma 
    END 

    CAMADA DAL

    public DTO.Turmas SelectByName(DTO.Turma turma) 
            { 
                DTO.Turmas turmas = new DTO.Turmas(); 
                SqlConnection con = new SqlConnection(ConStr); 
                string SQL = "SelectTurmasByName"
                SqlCommand cmd = new SqlCommand(SQL, con); 
                cmd.CommandType = CommandType.StoredProcedure;             
                cmd.Parameters.AddWithValue("@Turma", turma.Turma1); 
                con.Open(); 
                SqlDataReader dr = cmd.ExecuteReader(); 
                while (dr.Read()) 
                {                 
                    turma.idTurma = int.Parse(dr["idTurma"].ToString()); 
                    turma.Turma1 = dr["Turma"].ToString(); 
                    turmas.Add(turma); 
                } 
                con.Close(); 
                return turmas; 
            } 

    BLL

    public DTO.Turmas SelectByName(DTO.Turma turma) 
            { 
                DAL.Turmas DalTurma = new DAL.Turmas(); 
                return DalTurma.SelectByName(turma); 
            } 


    Botao pesquisa no formulario

    private void btnBusca_Click(object sender, EventArgs e) 
            {             
                DTO.Turma DtoTurma = new DTO.Turma(); 
                DtoTurma.Turma1 = txtBusca.Text; 
                BLL.Turmas BllTurmas = new BLL.Turmas(); 
                dataGridView1.DataSource = BllTurmas.SelectByName(DtoTurma);             
                dataGridView1.Columns[0].HeaderText = "Cod"
                dataGridView1.Columns[1].HeaderText = "Turma";            
            }       
     

    A camada DTO tem somentes Gets e Sets

    Alguem pode dar uma luza de como posso realizar a consulta com filtros?? eu imaginava ser com like na stored procedure, mas como eu não sei o que o usuário vai digitar no textbox não consegui implementar, alguem pode me dar uma luz??
    domingo, 15 de fevereiro de 2009 14:50

Respostas

  • Tenta assim.... mesmo pq isso eh mais uma questao de boas praticas... ja q vc consulta por nome... passa o nome... e nao a classe ... ja q teoricamente vc nao tem os dados validos do objeto nela neste ponto ....

    public DTO.Turmas SelectByName(string nome
            { 
                DTO.Turmas turmas = new DTO.Turmas(); 
                SqlConnection con = new SqlConnection(ConStr); 
                string SQL = "SelectTurmasByName"
                SqlCommand cmd = new SqlCommand(SQL, con); 
                cmd.CommandType = CommandType.StoredProcedure;             
                cmd.Parameters.AddWithValue("@Turma", nome); 
                con.Open(); 
                SqlDataReader dr = cmd.ExecuteReader(); 
                while (dr.Read()) 
                {                 
                   DTO.Turma turma = new DTO.Turma();
                   
    turma.idTurma = int.Parse(dr["idTurma"].ToString()); 
                    turma.Turma1 = dr["Turma"].ToString(); 
                    turmas.Add(turma); 
                } 
                con.Close(); 
                return turmas; 
            } 

    • Marcado como Resposta Douglas Luiz terça-feira, 24 de fevereiro de 2009 18:07
    sábado, 21 de fevereiro de 2009 16:35
    Moderador

Todas as Respostas

  • Douglas,

    Tenta mudar o seu comando select para:

    SELECT * from Turmas 
        WHERE Turma like @Turma 

    A cláusula LIKE faz busca parcial.

    []s,
    Carlos dos Santos - cdssoftware.spaces.live.com
    segunda-feira, 16 de fevereiro de 2009 02:18
  • Carlos valeu pela resposta, acabei conseguindo com o pessoal da sessão sql server a resposta, no fim era bem parecido com o seu:

    SELECT * FROM Turmas 
             WHERE Turma LIKE @Turma + '%'

    Mas valeu mesmo por ter respondido

    abraço e muito obrigado.
    segunda-feira, 16 de fevereiro de 2009 23:40
  • Galera desculpa, achei que tinha resolvido os problemas, mas não ......  a procedure esta OK faz exatamente o que eu quero, procura os registros que iniciem com a(s) letra(s) digitadas como parametro.

    Mas na minha aplicação ainda nao ta OK, ela ao invés de exibir os dados iniciados com as letras digitadas, traz somente 1 registro duplicado em 2 linhas.

    exemplo:

    Cod  Turma
    1      Pré 2
    1      Pré 2

    Alguem pode me dizer onde eu estou errando no código da aplicação??

    Segue meu código

    CAMADA DAL

    public DTO.Turmas SelectByName(DTO.Turma turma) 
            { 
                DTO.Turmas turmas = new DTO.Turmas(); 
                SqlConnection con = new SqlConnection(ConStr); 
                string SQL = "SelectTurmasByName"
                SqlCommand cmd = new SqlCommand(SQL, con); 
                cmd.CommandType = CommandType.StoredProcedure;             
                cmd.Parameters.AddWithValue("@Turma", turma.Turma1); 
                con.Open(); 
                SqlDataReader dr = cmd.ExecuteReader(); 
                while (dr.Read()) 
                {                 
                    turma.idTurma = int.Parse(dr["idTurma"].ToString()); 
                    turma.Turma1 = dr["Turma"].ToString(); 
                    turmas.Add(turma); 
                } 
                con.Close(); 
                return turmas; 
            } 



    CAMADA BLL

    public DTO.Turmas SelectByName(DTO.Turma turma) 
            { 
                DAL.Turmas DalTurma = new DAL.Turmas(); 
                return DalTurma.SelectByName(turma); 
            } 


    INTERFACE

    private void btnBusca_Click(object sender, EventArgs e) 
            {             
                DTO.Turma DtoTurma = new DTO.Turma(); 
                DtoTurma.Turma1 = txtBusca.Text; 
                BLL.Turmas BllTurmas = new BLL.Turmas();             
                dataGridView1.DataSource = BllTurmas.SelectByName(DtoTurma); 
                dataGridView1.Columns[0].HeaderText = "Cod"
                dataGridView1.Columns[1].HeaderText = "Turma";            
            }         


    Alguem pode me dar um HELP??

    obrigado mais uma vez
    terça-feira, 17 de fevereiro de 2009 22:02
  •  Ola Douglas, ja tentou fazer isso na procedure:

    ALTER PROCEDURE [dbo].[SelectTurmasByName] 
    @Turma varchar(50) 
    AS 
    BEGIN    
        SELECT * from Turmas 
        WHERE Turma like @Turma +'%' or @Tuma = Null
    END 

    Nelson Borges - Analista de Sistemas
    quarta-feira, 18 de fevereiro de 2009 04:03
  • Nelson

    não deu certo, continua me retornando valores duplicados na aplicação, apenas na procedure que da certo.

    acredito que deva ter algo errado no meu codigo da camada DAL , já que rodando a procedure no management studio da certinho, mas não consigo achar o problema.

    continuo precisando de help

    obrigado
    quarta-feira, 18 de fevereiro de 2009 14:47
  • Douglas,

    Vamos lá, já que a idéia é ensinar, vou te mostrar a descobrir este tipo de erro, pode parecer primário, mas na maioria dos casos resolve.

    Na sua classe de negócio, coloque um breakpoint na assinatura do método para verificar oque ele esta recebendo e um outro para ver oque ele esta passando, uma outra coisa que uso para pegar valores entre o banco e a aplicação é o Profiler (Tools SQL -> Profiler), assim vc poderá ver se este método (Classe de dados) esta recebendo os valores incorretos e posteriormente identificar qual o método que esta com problemas.


    Duvidas, poste ai.


    Att
    Nelson Borges - Analista de Sistemas
    quarta-feira, 18 de fevereiro de 2009 16:07
  • Nelson, vamos lá, não sei se fiz da forma correta.

    Na minha classe ne negócios (BLL) fiz assim

    //breakepoint na assinatura do método abaixo 
    public DTO.Turmas SelectByName(DTO.Turma turma) 
            { 
                DAL.Turmas DalTurma = new DAL.Turmas(); 
     
                //outro breakpoint abaixo no retorno do método 
                return DalTurma.SelectByName(turma); 
            } 


    Digitei somente "J" no textbox de pesquisa de forma que ele deveria me retornar (como na procedure):

    COD  TURMA
    1        Jardim I
    3        Jardim II

    Mas ele me retorna

    COD   TURMA
    1        Jardim I
    1       Jardim I

    No 1º Breakpoint da assinatura do método me retorna isso:

           
           
            NAME          VALUE               TYPE
            this         {BLL.Turmas}         BLL.Turmas 
    -       turma        {DTO.Turma}          DTO.Turma 
            _idTurma     0                   int 
            _Turma       "J"                 string 
            idTurma      0                   int 
            Turma1       "J"                 string 
            DalTurma    null                 DAL.Turmas 
     


    No 2º Breakpoint no "return" do método

        NAME       VALUE         TYPE 
        this      {BLL.Turmas}    BLL.Turmas 
        turma     {DTO.Turma}     DTO.Turma 
        _idTurma   0              int 
        _Turma    "J"             string 
        idTurma    0              int 
        Turma1     "J"            string 
        DalTurma  {DAL.Turmas}    DAL.Turmas 
        ConStr  "Data Source=DOUGLAS-PC\\SQLEXPRESS;Initial Catalog=TremBD;Integrated Security=True"     string 
     


    Alguma luz?

    ahh não achei no meu visual studio 2008 esse profiler, cliquei em tools e não tem essa opção (SQL / Profiler)
    quinta-feira, 19 de fevereiro de 2009 21:50
  • Tenta assim.... mesmo pq isso eh mais uma questao de boas praticas... ja q vc consulta por nome... passa o nome... e nao a classe ... ja q teoricamente vc nao tem os dados validos do objeto nela neste ponto ....

    public DTO.Turmas SelectByName(string nome
            { 
                DTO.Turmas turmas = new DTO.Turmas(); 
                SqlConnection con = new SqlConnection(ConStr); 
                string SQL = "SelectTurmasByName"
                SqlCommand cmd = new SqlCommand(SQL, con); 
                cmd.CommandType = CommandType.StoredProcedure;             
                cmd.Parameters.AddWithValue("@Turma", nome); 
                con.Open(); 
                SqlDataReader dr = cmd.ExecuteReader(); 
                while (dr.Read()) 
                {                 
                   DTO.Turma turma = new DTO.Turma();
                   
    turma.idTurma = int.Parse(dr["idTurma"].ToString()); 
                    turma.Turma1 = dr["Turma"].ToString(); 
                    turmas.Add(turma); 
                } 
                con.Close(); 
                return turmas; 
            } 

    • Marcado como Resposta Douglas Luiz terça-feira, 24 de fevereiro de 2009 18:07
    sábado, 21 de fevereiro de 2009 16:35
    Moderador
  • Rui

    deu certinho com algumas modificações

    mudei o select para o jeito q vc sugeriu, passando string nome ao invés do objeto turma.

    alterei tb na camada BLL o return do metodo, ao inves de retornar o objeto turma no parametro eu coloquei pra retornar turma.nome e ai funcionou.

    Na vdd a apostila o autor utilizava objetos, mas ele nao fez um select por nome ou id, ele fez um select * ...... eu que por necessidade tentei na raça implementar um select por nome ou codigo.

    valeu pela dica deu certinho, brigadão.

    tenho q fazer um elogio pra esse fórum, pois até agora recebi auxilio nas minhas duvidas, diferente de outros lugares onde quem sabe, não tem interesse de ajudar quem ta começando.

    Nota 10 pra galera daqui

    abraço
    domingo, 22 de fevereiro de 2009 16:04
  • Prescisando tamo ai....

    Desculpa a demora... eh q eu to de ferias... e ando lendo pouco os post :P

    domingo, 22 de fevereiro de 2009 22:25
    Moderador