O galera to com uma duvida aqui alguem poderia me esclarecer?
segue o trecho do cod:
for(inti=0;i<this.listaFuncionario.size();i++){StringsqlSelect="Select count(id) as id from funcionario";result=statement.executeQuery(sqlSelect);result.next();//PRAQUEORESULT.NEXTAQUI?SENDOQUEEUSOQUEROOVALORDEREGISTROSDACOLUNAID?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".
StringsqlSelect="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:
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).
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(inti=0; i < this.listaFuncionario.size(); i++){StringsqlSelect="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
entanglement
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(inti=0; i < this.listaFuncionario.size(); i++){StringsqlSelect="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");}//fimdowhile}//fimdofor
yorgan
Não entendi a lógica do seu método.
Poderia descrever qual o objetivo dele?
evertonsilvagomesjav
o metodo estava assim:
for(inti=0; i < this.listaFuncionario.size(); i++){StringsqlSelect="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");}
}//fimdofor
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
StringsqlSelect="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");}
}//fimdowhile}//fimdofor
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
publicIntegercontarFuncionarios(){IntegernrFuncionarios=null;StringSQL="SELECT count(*) as nr_funcionarios FROM funcionario ";Connectioncn=getConexao();//estou presumindo que esse seja o método que retorna uma conexão ativa.PreparedStatementstatement=null;ResultSetresult=null;try{statement=cn.prepareStatement(SQL);result=statement.executeQuery();if(result.next()){nrFuncionarios=rs.getInt("nr_funcionarios");}result.close();statement.close();}catch(Exceptione){thrownewException(e);}finally{cn.close();}returnnrFuncionarios;}
Método de cadastro
publicbooleancadastrar(Funcionariofuncionario){
booleanresultado=false;if(contarFuncionarios()>2){
returnfalse; //Interrompe o método caso existam mais de 2 funcionários}
StringSQL="INSERT INTO funcionario (nome, cpf) VALUES (?, ?); ";Connectioncn=getConexao(); //estou presumindo que esse seja o método que retorna uma conexão ativa.PreparedStatementstatement=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(Exceptione){
thrownewException(e);}finally{
cn.close();}
returnresultado;
}