Olá pessoal,
Estou com um problema bem esquisito, nunca vi antes.
É o seguinte, tenho um programa que cadastra alunos e salva os dados em banco de dados. Está funcionando tudo certinho.
O problema é quando eu tento remover ou procurar por nome.
Se eu digitar o nome corretamente ou o primeiro nome, ele encontra normalmente, porém quando eu digito algo errado, ele deveria informar que o nome foi digitado incorretamente ou o aluno nao está cadastrado, mas ele nao informa nada e vai para o menu novamente.
Vou postar a parte do código de pesquisa por nome pra vcs me ajudarem com isso e ver oq ta acontecendo.
public void searchDataBase(String student) throws Exception
{
try
{
// This will load the MySQL driver, each DB has its own driver
Class.forName("com.mysql.jdbc.Driver");
// Setup the connection with the DB
connect = DriverManager
.getConnection("jdbc:mysql://localhost/cadastro?"
+ "user=cledarsie&password=clezito001");
statement = connect.createStatement();
// Resultset get the result of the SQLquery
resultSet = statement.executeQuery("SELECT * FROM alunos " +
"WHERE Nome like '"+student+"%' Order By Nome;");
while (resultSet.next())
{
id = resultSet.getInt("id");
nome = resultSet.getString("nome");
cpf = resultSet.getString("cpf");
tel = resultSet.getString("telefone");
end = resultSet.getString("endereco");
bai = resultSet.getString("bairro");
cid = resultSet.getString("cidade");
uf = resultSet.getString("uf");
cep = resultSet.getString("cep");
if (nome.startsWith(student.toUpperCase()))
{
System.out.println("\n===================================================");
System.out.println("ID: " + id);
System.out.println("Name: " + nome);
System.out.println("CPF: " + cpf);
System.out.println("Phone: " + tel);
System.out.println("Address: " + end);
System.out.println("Neighborhood: " + bai);
System.out.println("City: " + cid);
System.out.println("UF: " + uf);
System.out.println("CEP: " + cep);
System.out.println("===================================================");
}else{ //Se nao encontrar, informa que nao existe o aluno
System.out.println("\n***************************************************");
System.out.println("| Student not found! |");
System.out.println("***************************************************\n");
}
}
} catch (Exception e) {
throw e;
} finally {
close();
}
}
Valeu galera!!!
Você só irá entrar na cláusula where quando houver algum registro no ResultSet.
Se não encontra aluno, o ResultSet não possui next().
Trate isso fora (um if resolve).
É o que o drsMachado falou. Se ele não encontrar o aluno, o método next() de cara irá retornar false.
Só não entendi um detalhe. Se você faz um throw de e, no seu catch, pra que você sequer põe o catch? Não era mais fácil fazer só um try…finally?
É verdade Vini, agora olhando com mais atençao eu vi q nao era necessario. Obrigado.
Vcs podem me dar uma ajuda nisso? Esse if eu faço fora do while?
Eu entendi q o metodo next() nao vai funcionar pq nao existe registro e retornará false, entao como ficaria esse if?
Nao consigo imaginar isso…
Obrigado.
Fazer o if verificar se o ResultSet possui o next(), já resolve.
só uma dúvida… se ele fizesse algo do tipo
if(rs.next()){
while(rs.next()){
// logica dele
}
}
ele perderia o primeiro registro, né? teria que fazer um rs.previous() ou algo do gênero caso o if retornasse true?
só perguntando mesmo porque fiquei meio na dúvida
Cara, nunca tive problemas com isso.
bom… depois eu testo por minha conta mesmo…
é que pelo que eu to vendo… quando ele testa o rs.next(), ele ja coloca o ponteiro no próximo registro, e ao entrar no while pega o próximo denovo…
mas tudo bem, rs… depois eu testo e confirmo
Sim, perderia p primeiro registro. Mas o previous() não é suportado por todo mundo… Por exemplo, se o ResultSet for “forward only”
Melhor não confiar nisso. Você pode fazer algo como:
[code]int contagem = 0;
for (; rs.next(); contagem++) {
//code
}
if (contagem == 0) {
// tratar 0
}[/code]
[quote]É isso mesmo que acontece digaoneves.
Quando eu coloco pra verificar se o resultSet é true, ele vai pra proxima linha.
E se por acaso eu quiser achar alguma coisa q tenha mesmo no banco, ele nao encontra, pq ele pula a linha que tem a informacao necessaria.
Sera q se eu colocar resultSet.first() no primeiro if ele acha?
tipo assim:
if (resultSet.first()){
while(resultSet.next()){
[/quote]
Acabei de testar e nao funciona.
cle.darsie se você só adicionou a linha que eu falei não vai funcionar mesmo… você tem que tratar o else desse if como estava tratando o else do if que está dentro do while…
se esse if que testa o resultset retorna false, aí sim você imprime aquelas mensagens " Student not found! "
Sim digaoneves, eu tratei o if… Ai ele da certo pra mensagem “student not found” se eu digitar algo q nao existe.
O problema é quando eu quero achar alguem q ta cadastrado realmente, ele nao encontra.
Vou tentar do jeito que o leo.adven disse, com um for.
a idéia mastigada é mais ou menos essa:
if(rs.next()){
rs.first();
while(rs.next()){
// lógica que imprime os dados do student
}
}else{
// System.out que diz que o student não foi encontrado
}
assim ele testa, e se encontrar retorna ao primeiro registro do resultset
Problema resolvido galera, utilizando a ideia do leo.adven, de usar um for, ele funciona certinho.
[quote]a idéia mastigada é mais ou menos essa:
[code]
if(rs.next()){
rs.first();
while(rs.next()){
// lógica que imprime os dados do student
}
}else{
// System.out que diz que o student não foi encontrado
} [/code]
assim ele testa, e se encontrar retorna ao primeiro registro do resultset[/quote]
Assim ele nao da certo tambem. Testei dos dois modos.
Valeu todos pela ajuda.
:thumbup:
Deixo a sugestão de utilizar uma ferramenta para te ajudar a fazer acesso a base de dados de forma mais ágil: Apache Commons DBUtils para te ajudar a trabalhar com JDBC direto!
Acho q se vc faz …
if(rs.first()){
while(rs.next()){
//code
}
}
vc ta indo para a 2° linha … o primeiro comando vai para a primeira linha do código … o segundo vai para a próxima linha …
e se ele fizer algo como …
if(rs.first()){
do{
//code
}while(rs.next())
}
acho q assim vai resolver o problema do nosso amigo ae…
– edit
– ok então coloque [RESOLVIDO] no seu primeiro post
Só pra deixar mais claro:
- O first() move o ponteiro “de volta” para o primeiro registro. Isso pode ser uma operação ilegal, dependendo do result set, se você faz, por exemplo, next() - first().
- O isFirst() indica se você está no primeiro registro. Isso é uma implementação opcional em alguns tipos de result set
- O “melhor jeito”, na minha opinião e sem utilizar nenhuma lib, é você capturar tudo num List<Map<String, String>> listamapa e testar se o listamapa está com size 0. Primeiro você captura os dados, depois você trabalha com eles. Desse jeito, você não depende da implementação do driver JDBC…