[RESOLVIDO] Não retorna erro no SQL

17 respostas
C

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!!!

17 Respostas

D

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).

V

É 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?

C

É 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.

D

Fazer o if verificar se o ResultSet possui o next(), já resolve.

R

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

D

Cara, nunca tive problemas com isso.

R

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

L

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:

int contagem = 0;
for (; rs.next(); contagem++) {
  //code
}

if (contagem == 0) {
  // tratar 0
}
C

É 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()){

Acabei de testar e nao funciona.

D

Ou rs.first()

R

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! "

C

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.

R

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

C
Vou tentar do jeito que o leo.adven disse, com um for.

Problema resolvido galera, utilizando a ideia do leo.adven, de usar um for, ele funciona certinho.

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

Assim ele nao da certo tambem. Testei dos dois modos.

Valeu todos pela ajuda.

L

: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!

K

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

L

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…
Criado 19 de maio de 2011
Ultima resposta 19 de mai. de 2011
Respostas 17
Participantes 6