Operation not allowed after resultset closed!

10 respostas
D

Estou com o seguinte problema: na parte do código abaixo quando compilo retorna o seguinte erro: operation not allowed after resultset closed. Já vi alguns tópicos referentes a esse erro mas não consegui corrigí-lo. Se alguém puder me ajudar ficarei muito grato. Obrigado.

public void inserir(JFormattedTextField data, JComboBox cbIdentProjetor, JFormattedTextField 
			txtHrInicio,JFormattedTextField txtHrTermino, ButtonGroup radioGrupoCateg, JTextField 
			txtNome,ButtonGroup radioGrupoEvent, JTextField txtEspecificar, JTextArea jtxObs, 
			JComboBox cbProf, JComboBox cbDisc){
		
		connection.conectar();
		
		
		try{
			
			connection.executeSQL("SELECT * FROM reserva_projetor");
			connection.stm.executeQuery("SELECT data, hora_inicio, hora_termino FROM reserva_projetor");
			
			
			//System.out.println("TESTEEE-------: " + connection.rs.getString("data"));
			
			while(connection.rs.next()){
				if(connection.rs.getString("data").equals(data.getText()) && connection.rs.getString("hora_inicio").equals(txtHrInicio.getText())
						&& connection.rs.getString("hora_termino").equals(txtHrTermino.getText())){
					
					JOptionPane.showMessageDialog(null, "Reserva já existente!");
					
				}else{
					
					int indentProjetor = cbIdentProjetor.getSelectedIndex()+1;
					
					if(radioGrupoCateg.getSelection().getActionCommand() == "Aluno" ||
							radioGrupoCateg.getSelection().getActionCommand() == "Funcionário" && 
							radioGrupoEvent.getSelection().getActionCommand() == "Curso" ||
							radioGrupoEvent.getSelection().getActionCommand() == "Outros"){
						connection.stm.executeUpdate("INSERT INTO reserva_projetor " +
								"(projetor, data, hora_inicio, hora_termino, requisitante, nome_requisitante, evento, " +
								"nome_evento, observacao) VALUES('"+indentProjetor+"','"+ data.getText() + "','"+
								txtHrInicio.getText()+"','"+txtHrTermino.getText()+"', '"+radioGrupoCateg.getSelection().getActionCommand()
								+"','"+	txtNome.getText()+"','"+radioGrupoEvent.getSelection().getActionCommand()+"','"+
								txtEspecificar.getText()+"','"+jtxObs.getText()+"')");
						
					}else{
						
						connection.stm.executeUpdate("INSERT INTO reserva_projetor (projetor, data, hora_inicio, " +
								"hora_termino, requisitante, nome_requisitante, evento, nome_evento, observacao) " +
								"VALUES ('"+indentProjetor+"','"+data.getText()+ "','"+txtHrInicio.getText()+"','"+
								txtHrTermino.getText()+"','"+radioGrupoCateg.getSelection().getActionCommand()
								+"','"+cbProf.getSelectedItem()+"','"+radioGrupoEvent.getSelection().getActionCommand()+"','"+
								cbDisc.getSelectedItem()+"','"+jtxObs.getText()+"')");
						
						}
					}
			}
			
			
			}catch (SQLException e) {
				JOptionPane.showMessageDialog(data, this,"Erro no comando SQL "+ e.getMessage(), 0);
			}finally{
				connection.desconectar();
			}
			
	}

10 Respostas

A

esse teu rs ta vindo de onde? ta um tanto meio(muito) bagunçado teu código. posta a conexão ai tb

D

Blz parceiro. É pq ta em outra classe chamada conexão. Segue o código abaixo.

public class Conexao {
	
	private String URL = "jdbc:mysql://localhost/nucae";
	private String USER = "root";
	private String PASSWORD = "servicosNUCAE";
	private Connection conn;
	public Statement stm = null;
	public ResultSet rs = null;
	
	public boolean conectar(){
		
		boolean result = true;
		
		try{
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
			System.out.println("Conectado com sucesso!!");
		}catch (ClassNotFoundException Driver) {
			System.out.println("Driver não localizado: " + Driver);
			result = false;
		}catch (SQLException banco) {
			System.out.println("Erro ao conectar ao banco!" + banco);
			result = false;
		}
		
		return result;
	}
	
	public void desconectar(){
		
		boolean result = true;
		
		try{
			conn.close();
			System.out.println("Banco desconectado");
		}catch (SQLException fechar) {
			System.out.println("Não foi possível fechar o banco!" + fechar);
			result = false;
		}
	}
	
	public void executeSQL(String sql){
		
		try{
			stm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
			rs = stm.executeQuery(sql);	
			
		}catch (SQLException sqlex) {
			System.out.println(sqlex.getMessage());
		}
		
	}
R

Aparentemente quando executa a linha 11 do seu código ele cria o ResultSet normalmente, mas depois da linha 12 ele fecha porque você executa uma chamada do método “executeQuery” da classe “Statement” e não da sua classe “Conexao”.

connection.executeSQL("SELECT * FROM reserva_projetor");   
connection.stm.executeQuery("SELECT data, hora_inicio, hora_termino FROM reserva_projetor");
D

Nesse caso tenho que retirar a linha 11? Não sei como resolver… Vlw!

D

Na verdade o que quero fazer no meu sistema com esse método é uma forma de não conseguir cadastrar reservas no banco de dados com a mesma data e o mesmo horário de início e término… Alguém tem alguma idéia melhor? Eu to indo pelo caminho certo? vlw galera!

luizlopes

dededobem,

você pode criar uma constraint na sua base para esses dois campos serem únicos e fazer um tratamento para as exceptions.

A sintaxe para criar uma constraint depende do banco de dados, mas deve ser parecida com:

ALTER TABLE nome_da_tabela
ADD CONSTRAINT nome_da_constraint
UNIQUE (field1,field2);

Acho legal usar o jdbc “puro”, mas já que você está interessado, você pode estudar sobre mapeamento objeto-relacional (jpa, hibernate) que é bem legal…

D

Obrigado luizlopes !
Vou vê se consigo fazer assim!

Vlw!

D

Tentei, mas n obtive sucesso…

:frowning:

luizlopes

ok… vamos por partes.

vamos tentar fazer esse seu código funcionar, depois a gente tenta melhora-lo, ok?

primeiro, acho desnecessário vc ter duas selects (linhas 11 e 12), então comente ou exclua a linha 12 e teste seu código.

também ajuda se você nos mostrar o erro inteiro, fica mais facil para rastrear a origem do problema…

D

Blz luizlopes, já tive uma pequena evolução aqui. Esse erro já desapareceu, agora tá com um erro de programação. Qq coisa te aviso. Obrigado pela ajuda! :slight_smile:

Criado 1 de julho de 2010
Ultima resposta 5 de jul. de 2010
Respostas 10
Participantes 4