[RESOLVIDO] Não retorna erro no SQL

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.

Ou rs.first()…

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…