ERRO: java.sql.SQLException: Operation not allowed after ResultSet closed

6 respostas Resolvido
java
George_Luis1

Boa noite, amigos
Tudo bem?

Sou iniciante no mundo da programação, através de tutorias estou tentando aprender e desenvolver, porém infelizmente não estou conseguindo entender o erro abaixo do meu código. Por gentileza, poderia me ajudar?

java.sql.SQLException: Operation not allowed after ResultSet closed

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)

at com.mysql.cj.jdbc.result.ResultSetImpl.checkClosed(ResultSetImpl.java:437)

at com.mysql.cj.jdbc.result.ResultSetImpl.next(ResultSetImpl.java:1712)

at UsuarioGRUD.Acesso.loginInstrutor(Acesso.java:24)

at UsuarioGRUD.Acesso.main(Acesso.java:40)

Esse é o erro

package UsuarioGRUD;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import BancoDados.Conexao;

public class Acesso {
Conexao conex = new Conexao();

public boolean loginInstrutor(String nomeInstrutor, String senha) throws SQLException {
		boolean resposta = false;
		ResultSet dados = null;
		String sql = "SELECT nomeInstrutor, senhaInstrutor FROM tbl_instrutor WHERE nomeInstrutor=? AND senhaInstrutor=?";
		
		PreparedStatement estatus = null;
		try {
			estatus = conex.getConexao().prepareStatement(sql);
			estatus.setString(1, nomeInstrutor);
			estatus.setString(2, senha);
			dados = estatus.executeQuery();
			estatus.execute();
			
			
			if(dados.next()) {
				
				return resposta = true;
			}else {
				return resposta = false;
			}
			
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}finally {
            try{
            	estatus.close();
            }catch(SQLException onConClose){
		return resposta;			
	}}
		return resposta;}
	
	public static void main(String[]args){
		Acesso teste = new Acesso();
		try {
			if(teste.loginInstrutor("teste","teste")) {
				System.out.print("Seja Bem-vindos");
			}else {
				System.out.print("Erro ao logar");
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

6 Respostas

lvbarbosa

estatus.close();

Essa linha fecha o PreparedStatement, que por consequência fecha o ResultSet associado. Em seguida você tenta acessar o ResultSet fechado (dados.next()), o que causa a exceção que você está vendo.

Uma sugestão é declarar o PreparedStatement fora do try/catch e colocar essa linha dentro de um finally. Outra alternativa é usar um try with resources.

George_Luis1

Amigo, obrigado mesmo. Vou tentar fazer aqui

George_Luis1

Primeiramente, obrigado pela atenção e ajuda ao novos iniciantes
Fiz isso mas o erro ainda continua, será que tem outro jeito???

package UsuarioGRUD;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import BancoDados.Conexao;

public class Acesso {
Conexao conex = new Conexao();

public boolean loginInstrutor(String nomeInstrutor, String senha) throws SQLException {
		boolean resposta = false;
		ResultSet dados = null;
		String sql = "SELECT nomeInstrutor, senhaInstrutor FROM tbl_instrutor WHERE nomeInstrutor=? AND senhaInstrutor=?";
		
		PreparedStatement estatus = null;
		try {
			estatus = conex.getConexao().prepareStatement(sql);
			estatus.setString(1, nomeInstrutor);
			estatus.setString(2, senha);
			dados = estatus.executeQuery();
			estatus.execute();
			
			
			if(dados.next()) {
				
				return resposta = true;
			}else {
				return resposta = false;
			}
			
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}finally {
            try{
            	estatus.close();
            }catch(SQLException onConClose){
		return resposta;			
	}}
		return resposta;}
	
	public static void main(String[]args){
		Acesso teste = new Acesso();
		try {
			if(teste.loginInstrutor("teste","teste")) {
				System.out.print("Seja Bem-vindos");
			}else {
				System.out.print("Erro ao logar");
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}______________________________________

Erro ao logarjava.sql.SQLException: Operation not allowed after ResultSet closed

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)

at com.mysql.cj.jdbc.result.ResultSetImpl.checkClosed(ResultSetImpl.java:437)

at com.mysql.cj.jdbc.result.ResultSetImpl.next(ResultSetImpl.java:1712)

at UsuarioGRUD.Acesso.loginInstrutor(Acesso.java:26)

at UsuarioGRUD.Acesso.main(Acesso.java:47)
lvbarbosa
Solucao aceita

estatus.execute(); remova essa linha. Você está fazendo a query duas vezes, nessa linha e na de cima. Na segunda, está jogando o resultado da primeira fora (fechando o ResultSet).

George_Luis1

Muito obrigado
Deu certo graça a sua ajuda, com certeza essa dúvida vai ajudar outras pessoas.
Obrigado mesmo!!!

staroski
dados = estatus.executeQuery();
estatus.execute();  <-- apaga essa linha aqui, você já executou o statement na linha anterior
if (dados.next()) {
Criado 20 de outubro de 2019
Ultima resposta 21 de out. de 2019
Respostas 6
Participantes 3