Duvida java + banco ( result.next() ) [resolvido]

12 respostas
evertonsilvagomesjav

O galera to com uma duvida aqui alguem poderia me esclarecer?

segue o trecho do cod:

for(int i=0; i < this.listaFuncionario.size(); i++){
			  String sqlSelect = "Select count(id) as id from funcionario";
			 		result = statement.executeQuery(sqlSelect);
			 			result.next(); // PRA QUE O RESULT.NEXT AQUI? SENDO QUE EU SO QUERO O VALOR DE REGISTROS DA COLUNA ID?
			 				contaColuna = result.getInt("id");
			 					System.out.println(contaColuna);
			 								
			 			 	
		 if(contaColuna < 3){ 	
			 		
			 sql = "insert into funcionario (nome,cpf)" 
			 	 + "values ('"+this.listaFuncionario.get(i).getNome()+"',  " +
	     			"'"+this.listaFuncionario.get(i).getCpf()+"')";
			 			statement.executeUpdate(sql);
			 	 
		 	 }else{
			JOptionPane.showMessageDialog(null,"Registro Finalizado");

PRA QUE O RESULT.NEXT() SENDO QUE EU SO QUERO O VALOR DE REGISTROS DA COLUNA ID ISSO O COUNT FAZ NAO?

OUTRA DUVIDA E O SEGUINTE TEM ALGUM METODO TIPO PRA CAPTURAR O VALOR DO RESULT, SEI QUE NAO EXISTE MAIS TIPO UM "RESULT.LENGTH".

12 Respostas

E
String sqlSelect = "Select count(id) as id from funcionario";  
           result = statement.executeQuery(sqlSelect);  
           if (result.next())
           {
               contaColuna = result.getInt("id");  
               System.out.println(contaColuna);  
               ...

Na verdade, o correto é sempre testar o retorno de “next” (que pode ser dentro de um “if” ou “while”).

O que ocorre, na verdade, é o seguinte: “executeQuery” volta um “resultset” que está sempre posicionado ANTES da primeira posição.
Ou seja, se você chamar logo de cara o método “getInt”, sem o “next”, você vai tomar uma exceção na sua cara, porque o resultset está no lugar errado.
Você precisa SEMPRE chamar o método “next” para que ele avance uma posição e carregue os valores desejados do registro corrente. É assim que funciona, porque o “executeQuery” não tem como saber se o resultset é vazio ou não, nem que sua expressão SQL vai voltar exatamente um registro (que é o seu caso). Então, mesmo que volte apenas um registro, ele nunca deixa posicionado na primeira posição sempre. Ele sempre começa posicionado ANTES da primeira posição e é sempre assim que ele funciona.

yorgan

O result.next() posiciona o cursor da coleção na primeira posição da mesma.
No seu caso você só terá uma posição, então não é necessário continuar iterando.

Para fica mais didático, ele faz algo mais ou menos assim:
Seu select retorna algo +/- assim:

ID
     555 -> Quando você aciona o método next, o cursor se posiciona na primeira linha.

Caso existisse mais uma linha, acionando novamente o next você iria para a segunda linha:
Exemplo de caso de uso: utilizando Group By

GRUPO      ID
         GR1      500
         GR2        55   -> Posição do cursor quando o next é acionado pela segunda vez.

[]´s

Daniel

evertonsilvagomesjav

entanglement e yorgan vlwww pela explicaçao agora entendi o pq do next ehe.

agora quando ao capturar o valor do result tipo se tenho cinco linhas e o next() iterou até a quinta tem como eu pegar esse valor como se fosse um “result.length” (sei que nao é isso).

yorgan

Você pode fazer assim:

int nrLinhas = 0;
while(result.next()) {
    nrLinhas++;
    //aqui continua o código para pegar os dados do result
    result.getInt(1);
    result.getInt("id");
    //etc...
}

Recomendo que você utilize sempre while ou if para evitar que uma excessão seja disparada.

[]´s

Daniel

evertonsilvagomesjav

mesmo no meu caso com esse trecho de cod

for(int i=0; i < this.listaFuncionario.size(); i++){
			  
			 String sqlSelect = "Select count(id) as id from funcionario";
			 		result = statement.executeQuery(sqlSelect);
			 			result.next();
			 				contaColuna = result.getInt("id");
			 					System.out.println(contaColuna);

seria bom usar o while?

E

Dica: mesmo algo tão bobo quanto “select count(*)” - que deveria sempre retornar 1 e apenas 1 registro - pode ter algum problema de execução. Portanto, na prática as pessoas costumam testar sempre para ver se não houve algum problema.

evertonsilvagomesjav

entanglement vlw pela ajuda cara vlw mesmo, ultima pergunta, com o while pra testar o reult ficaria assim?

for(int i=0; i < this.listaFuncionario.size(); i++){
			  
			 String sqlSelect = "Select count(id) as id from funcionario";
			 		result = statement.executeQuery(sqlSelect);
			 			while(result.next()){
			 				contaColuna = result.getInt("id");
			 					System.out.println(contaColuna);
			 								
			 			 	
		 if(contaColuna < 3){ 	
			 		
			 sql = "insert into funcionario (nome,cpf)" 
			 	 + "values ('"+this.listaFuncionario.get(i).getNome()+"',  " +
	     			"'"+this.listaFuncionario.get(i).getCpf()+"')";
			 			statement.executeUpdate(sql);
			 	 
		 	 }else{
			JOptionPane.showMessageDialog(null,"Registro Finalizado");
		 
		 	
		}//fim do while
		}//fim do for
yorgan

Não entendi a lógica do seu método.
Poderia descrever qual o objetivo dele?

evertonsilvagomesjav

o metodo estava assim:

for(int i=0; i < this.listaFuncionario.size(); i++){
			  
			 String sqlSelect = "Select count(id) as id from funcionario";
			 		result = statement.executeQuery(sqlSelect);
			 			result.next();
			 				contaColuna = result.getInt("id");
			 					System.out.println(contaColuna);
			 								
			 			 	
		 if(contaColuna < 3){ 	
			 		
			 sql = "insert into funcionario (nome,cpf)" 
			 	 + "values ('"+this.listaFuncionario.get(i).getNome()+"',  " +
	     			"'"+this.listaFuncionario.get(i).getCpf()+"')";
			 			statement.executeUpdate(sql);
			 	 
		 	 }else{
			JOptionPane.showMessageDialog(null,"Registro Finalizado");
		 
		 	 }
		 
		}// fim do for

Seguindo o conselho de vcs eu tentei implementar o while no result.next() pra nao gerar exceções, e o cod ficou assim queria saber se estaria certo

String sqlSelect = "Select count(id) as id from funcionario";
		result = statement.executeQuery(sqlSelect);
		        while(result.next()){
			 contaColuna = result.getInt("id");
			     System.out.println(contaColuna);
			 							
			 			 	
		 if(contaColuna < 3){ 	
			 		
			 sql = "insert into funcionario (nome,cpf)" 
			 	 + "values ('"+this.listaFuncionario.get(i).getNome()+"',  " +
	     			"'"+this.listaFuncionario.get(i).getCpf()+"')";
			 			statement.executeUpdate(sql);
			 	 
		 	 }else{
			JOptionPane.showMessageDialog(null,"Registro Finalizado");
		 
		 	 }
		 
		}//fim do while
		}// fim do for
yorgan

O que eu não entendi é a lógica do método.
Você conta o número de funcionários cadastrados e se existir um número de registros menor que 3 você insere um registro novo.
É isso que você precisa fazer? Então se já tiverem 3 funcionários cadastrados, você não poderá cadastrar o 4, é isso?

[]´s

Daniel

evertonsilvagomesjav

e isso mesmo Daniel, ja tava funcionando so quero saber se esta certo o while(result.next())

yorgan

Eu quebraria isso em dois métodos e faria utilizaria mais orientação a objetos, fazendo algo +/- assim:

Método de contagem

public Integer contarFuncionarios() {
     Integer nrFuncionarios       = null;
     String SQL                   = "SELECT count(*) as nr_funcionarios FROM funcionario ";
     Connection cn                = getConexao(); //estou presumindo que esse seja o método que retorna uma conexão ativa.
     PreparedStatement  statement = null;
     ResultSet result             = null;
     try {
          statement = cn.prepareStatement(SQL);
          result    = statement.executeQuery();
          if(result.next()) {
               nrFuncionarios = rs.getInt("nr_funcionarios");
          }
          result.close();
          statement.close();
     } catch (Exception e) {
          throw new Exception(e);
     } finally {
          cn.close();
     }
     
     return nrFuncionarios;
}

Método de cadastro

public boolean cadastrar(Funcionario funcionario) {
     boolean resultado            = false;
     if(contarFuncionarios() > 2) {
          return false; //Interrompe o método caso existam mais de 2 funcionários
     }
     String SQL                   = "INSERT INTO funcionario (nome, cpf) VALUES (?, ?); ";
     Connection cn                = getConexao(); //estou presumindo que esse seja o método que retorna uma conexão ativa.
     PreparedStatement  statement = null;
     try {
          statement = cn.prepareStatement(SQL);
          statement.setString(1, funcionario.getNome()); //Coloca o valor no primeiro ?
          statement.setString(2, funcionario.getCpf()); //Coloca o valor no segundo ?
          resultado = !statement.execute();
          statement.close();
     } catch (Exception e) {
          throw new Exception(e);
     } finally {
          cn.close();
     }
     return resultado;
}

E aqui a chamada no método que você estava:

boolean funcionarioCadastrado = cadastrar(this.listaFuncionario.get(i));

Digitei direto aqui, então talvez você tenha que ajustar alguma coisa.

[]´s

Daniel

Criado 13 de outubro de 2009
Ultima resposta 13 de out. de 2009
Respostas 12
Participantes 3