Usuário com melhor resposta
Consulta com parametros

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 BDALTER PROCEDURE [dbo].[SelectTurmasByName] @Turma varchar(50) AS BEGIN SELECT * from Turmas WHERE Turma = @Turma END
CAMADA DALpublic 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; }
BLLpublic DTO.Turmas SelectByName(DTO.Turma turma) { DAL.Turmas DalTurma = new DAL.Turmas(); return DalTurma.SelectByName(turma); }
Botao pesquisa no formularioprivate 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??
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
Todas as Respostas
-
-
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.
-
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 DALpublic 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 BLLpublic DTO.Turmas SelectByName(DTO.Turma turma) { DAL.Turmas DalTurma = new DAL.Turmas(); return DalTurma.SelectByName(turma); }
INTERFACEprivate 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
-
-
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
-
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 -
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étodoNAME 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)
-
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
-
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
-