Erro ResultSet está fechado

2 respostas
B
Pessoal estou fazendo a parte de atualizar algum dado que a pessoa entrar, só que quando coloco o nome da pessoa que é para ser atualizado, exibe uma mensagem de erro dizendo que -> Este ResultSet está fechado. Só que eu não fecho ele em lugar algum e estar dando esse erro.
package DAO;

import java.sql.Connection; 
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class alteraDados {
	
	public void autaliza(){
		
		
		Scanner ler = new Scanner(System.in);
		conectaBancoDAO carrega = new conectaBancoDAO();
		
		Connection con = null;
		Statement stm =  null;
		ResultSet rs = null;
		
		boolean consulta = true;
		
		try{
			
			con = carrega.fazConexao();
			stm = con.createStatement();
			
			
			System.out.println("Informe o nome que procura");
			String alterar = ler.next();
			
			//aqui estou vendo se o nome existe no bando de dados
			 rs = stm.executeQuery(" SELECT * from cadastro where cad_nome = '"+alterar+"' "); 
			 
			//aqui o while vai percorrer toda a tabela e ver se existe o banco de dados 
			 //se o nome existe entra aqui no while e faz o update
			while(rs.next()){
				consulta = false;
				
				System.out.println("Informe o nome para substituir");
				String nome = ler.next(); 
				 
				stm.executeUpdate("UPDATE cadastro set cad_nome= '"+alterar+"' where cad_nome= '"+nome+"' "); 
				
				System.out.println("Dados Alterados com Sucesso");
				  stm.close(); 
				  ler.close();
			}
			
			if(consulta){
				System.out.println("Nome não consta no banco");
			}
			
			 
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}
Já fiz a parte de excluir, inserir e listar e todos estão dando certo, somente esse de fazer a atualização que não estou conseguindo fazer

2 Respostas

B

while(rs.next()){
consulta = false;

System.out.println("Informe o nome para substituir");
			String nome = ler.next(); 
			 
                           //e so add esse pedaço de código que para de dar errado 
			stm = con.createStatement();



			stm.executeUpdate("UPDATE cadastro set cad_nome= '"+nome+"' where cad_nome= '"+alterar+"' "); 
			
			System.out.println("Dados Alterados com Sucesso");
			  stm.close(); 
			  ler.close();
		}
S

Cara, tenta um jeito mais elegante de arrumar e não complicar sua vida, do jeito que você fez funciona, mas com o tempo o consumo de memória vai aumentar desnecessariamente, tente dessa forma:

...
try{  
              
            con = carrega.fazConexao();  
            stm = con.createStatement();  
              
              
            System.out.println("Informe o nome que procura");  
            String alterar = ler.next();  
              
            //aqui estou vendo se o nome existe no bando de dados  
             rs = stm.executeQuery(" SELECT * from cadastro where cad_nome = '"+alterar+"' ");   
               
            //aqui o while vai percorrer toda a tabela e ver se existe o banco de dados   
             //se o nome existe entra aqui no while e faz o update  
            while(rs.next()){  
                consulta = false;  
                  
                System.out.println("Informe o nome para substituir");  
                String nome = ler.next();   
                   
                stm.executeUpdate("UPDATE cadastro set cad_nome= '"+alterar+"' where cad_nome= '"+nome+"' ");   
                  
                System.out.println("Dados Alterados com Sucesso");  

                 // o problema pode estar aqui...
                 // stm.close();   
                 // ler.close();  
            }  

            rs.close();
            stm.close();
            con.close();
              
            if(consulta){  
                System.out.println("Nome não consta no banco");  
            }  
              
               
        }catch(Exception e){  
            e.printStackTrace();  
        }  
...

Faça alguns testes pois aqui estou usando apenas a lógica, não testei seu código, mas perceba que eu só fecho o rs quanto o stm apenas depois de passar pelo while e não dentro dele.

Outra dica, como você está iniciando tudo bem, mas evite misturar query com variáveis, pesquise a respeito de PreparedStatement para fazer queries desse tipo:

PreparedStatement pstm = con.prepareStatement("UPDATE cadastro SET cad_nome = ? WHERE cad_nome = ?");

pstm.setString(1, "Nome"); // nesse caso começa por 1 e não por zero como em arrays
pstm.setString(2, "Nome");
pstm.executeUpdate();
...

Segue um tuto da própria oracle, está em inglês mas o que vale é estudar o código de início:

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

Criado 3 de julho de 2013
Ultima resposta 3 de jul. de 2013
Respostas 2
Participantes 2