Alô, pessoal, como eu faço para ver se um campo no BD é igual ao conteudo de uma linha na JComboBox?
Abaixo está a parte crítica do código. Obrigado por qualquer ajuda.
query = "SELECT re, sexo FROM vigilante WHERE sexo = '" + cbSexoPesq.getSelectedItem() + "' ";
//query = "SELECT re, sexo FROM vigilante WHERE sexo = '" + cbSexoPesq.getSelectedItem().toString() + "' "; // Essa linha também não retorna nada
rs = stmt.executeQuery(query);
// Obs.: 'sexo' está como VARCHAR no BD (Firebird)
if(rs.next())
{
String sexo = rs.getString("sexo");
String re = rs.getString("re");
tTempSexo.setText(""+sexo);
tTempRe.setText(""+re);
lModPesq.addElement("SEXO: "+tTempSexo.getText());
lModPesq.addElement("RE: "+tTempRe.getText());
}
Porque você precisa comparar com o banco? Geralmente o conteúdo do combo é preenchido a partir de uma lista de objetos que você carrega do próprio banco.
Com concatenação, que é o jeito errado que ele usou, é necessário sim.
O ideal mesmo é usar um PreparedStatement:
String query = "SELECT re, sexo FROM vigilante WHERE sexo = ?";
PaparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, textoCombo);
ResultSet rs = stmt.executeQuery();
Aí sim, não só as aspas não são necessárias, como se o cara escrever no sexo “Man’s” não vai dar pau no programa.
Esse é um motivo bastante irrelevante para não usar uma variável. Lembre-se que variáveis para objetos em java são referências, portanto, ocupam apenas 4 míseros bytes.
Deve-se priorizar clareza e segurança ao codificar. Muitas vezes o compilador é capaz de eliminar variáveis locais como essa e, no final das contas, ambos os códigos ocupam a mesma quantidade de memória.
[quote]Nao é necessário usar aspas simples em java para colocar um componente swing dentro de uma string de consulta sql.
Reposicionando é apostrofo rsrs…
[/quote]
Então Vini, eu uso sempre nas consultas SQL concatenando “com +” - nunca tive problemas;
(query = “SELECT re, sexo FROM vigilante WHERE sexo =” + cbSexoPesq.getSelectedItem(); )
Acredito que fica mais facil de entender e menos código…
Pois pensando bem o conteudo e a propriedade do getSelectionItem do combo é uma String, entao na logica é a mesma coisa de um junta duas strings.
Se concatenar com + seu código também fica susceptível ao ataque de sql injection. Sem falar de vc ter que formatar manualmente data, tornando o código dependente do bd. Finalmente, o PreparedStatement é muito mais eficiente pois envia dados de forma binária pela rede (e é mais ainda se vc for rodar várias queries iguais no bd, trocando só parâmetros, pois ele mantém a consulta pronta no banco).
O conteúdo do getSelectionItem() do combo nem sempre é uma String. Muitas vezes colocamos objetos de negócio na combo para, por exemplo, exibirmos uma descrição, mas usar nos métodos o id.
Então, pessoal, Henrique Costa e demais colegas javistas. Vou dar mais uns detalhes do que realmente eu quero fazer no sistema que estou tentando fazer, para que, porventura, voces possam me ajudar: Entre outras coisas o cliente quer selecionar do banco, por exemplo, só pessoas (no caso vigilantes), de um determinado sexo(F ou M). Então eu tenho uma interface com um JComboBox, ele seciona, p. e., M, e com essa informação eu faço o select no banco, que exibe só as pessoas do sexo selecionado. Caro Kicolombo, conforme minha mensagem acima, coloquei ‘cbSexoPesq.getSelectedItem().toString()’, mas o programa não retorna nada também. Já capturei a informação para uma String, (String texteCombo = (String) cbSexoPesq.getSelectedItem() e coloquei ela (testeCombo) no select, mas também não funcionou. Há algo errado que ainda não consegui enxergar, mas vou observar todas as dicas de todos que opinaram e ver se consigo o retorno dessa informação. Fico no aguardo de qualquer outra dica e obrigado a todos.
[quote]Se concatenar com + seu código também fica susceptível ao ataque de sql injection. Sem falar de vc ter que formatar manualmente data, tornando o código dependente do bd. Finalmente, o PreparedStatement é muito mais eficiente pois envia dados de forma binária pela rede (e é mais ainda se vc for rodar várias queries iguais no bd, trocando só parâmetros, pois ele mantém a consulta pronta no banco).
O conteúdo do getSelectionItem() do combo nem sempre é uma String. Muitas vezes colocamos objetos de negócio na combo para, por exemplo, exibirmos uma descrição, mas usar nos métodos o id.
[/quote]
Boa Viny uma coisa que nao havia aprendido.
;]
Concordo tambem se nao esta retornando resultado deve ser erro na consulta SQL ou algo assim - aconselho voce usar uma instrução Try Catch para retornar alguma excessao, assim voce sabera com mais certeza qual é o problema.
Boa, ViniGodoy. Agora está retornando os dados. Depois que li sua observação, fui checar as Strings das combos, a do banco
e a da interface de pesquisa
(já corrigida). Havia um espaço a mais entre as aspas e o ‘M’ num dos elementos
(antes da correção) . e era isso que estava dando diferença, e em consequencia não retornava nada, pois os dados não eram exatamente iguais. Mais uma vez só me resta reconhecer o potencial de voces, quem sabe um dia eu me torne também um ajudador de outras pessoas, na programação Java. Obrigado e até a próxima dúvida!!!