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…