Problema com Classe Conexao e ResultSet

5 respostas
Hewerson

Criei uma classe Conexao

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;

public class Conexao {

	// ---------Variaveis para estabelecer conexao com o
	// banco-------------------\\
	private static Connection conn = null;// Conectar
	private static Statement statement;// Statement
	public ResultSet rs;// Result set da query

	private static final String driver = "sun.jdbc.odbc.JdbcOdbcDriver";// Driver
																		// jdbc
	private static final String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)}; "
			+ "DBQ=C://Arquivos de programas//PedidoCompra//sisPedidoCompra.mdb";

	private static final String login = "";// login
	private static final String pwd = "";// password

	public ResultSet getConexao(String sql, String acao) {

		try {

			Class.forName(driver);
			conn = DriverManager.getConnection(url, login, pwd);
			statement = conn.createStatement();

			if (acao.equals("cadastro") || acao.equals("alterar") || acao.equals("excluir")) 
			{
				statement.executeUpdate(sql);
			} else {
				rs = (statement.executeQuery(sql));
				return rs;
			}

		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Erro");
		} finally {

			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		return rs;
	}

}

e uma Classe para testar essa conexão

public class PegarConexao {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Conexao conecta = new Conexao();
			System.out.println(conecta.getConexao("select * from motivo", "query"));
                        
                        //Resgatar conteudo com ResulSet
            while(conecta.rs.next()){
				System.out.println(conecta.rs.getString("motivo"));
			}

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

	}

}

e me traz o seguinte erro

sun.jdbc.odbc.JdbcOdbcResultSet@fa39d7 
java.sql.SQLException: ResultSet is closed
	at sun.jdbc.odbc.JdbcOdbcResultSet.checkOpen(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcResultSet.next(Unknown Source)
	at PegarConexao.main(PegarConexao.java:13)

o que pode ser? obrigado

5 Respostas

Danillo_Moreno

Na sua classe Conexao no método getConexao voce está fechando a conexao (conn.close():wink:

ResultSet está ligado a conexao e voce não pode utilizá-lo após o fechamento da conexão…

Mude esse seu método para retornar outra coisa que não seja o ResultSet… (uma lista, uma string, não sei qual é o retorno dessa query)

Abraço…

Hewerson

Testei aqui sei o bloco finally{conn.close()} ele funcionou, o problema vai ser quando da erro, como vou fechar conexao.

Danillo_Moreno

O que voce colocar dentro do bloco finally sempre será executado, não importa que de erro ou não…

A estrutura try / catch / finally funciona mais ou menos assim…

try {
// Tente fazer isso aqui..
} catch(NaoDeuParaFazer){
// Porque não deu para Fazer ????
} finally {
// Faça isso aqui, independentemente do que aconteceu antes... Eu não me importo....
}

Por isso que eu acho que oa invés de você ter um método que te retorne o ResultSet, tenha um método que te retorne o conteúdo do ResultSet.

No teu caso me parece que o ResultSet traz uma String, então ficaria um método mais ou menos assim:

public String getResultado (String sql, String acao) {
//Crie uma string nova
try{
// Abre sua conexão
// execute a query
// Pegue o resultado da query (ResultSet) e coloque ele numa String 
} catch (Exception e) {  
// Pega a exception caso haja alguma
} finally {  
// Fecha sua conexão
}
// retorne sua String
}

Abraço…

Hewerson

Mas funcionou sem problemas ao retirar o finally{conn.close()}, mando fechar a conexao depois, mas simples talvez, pois pegando o ResulSet e retornado por String fica complicado se eu tiver mais de uma coluna. meu objetivo com essa clase Conexao é criar uma conexão genérica para todas as classes.

Danillo_Moreno

Funcionou porque você está deixando a conexxão aberta pra sempre…

Se o seu método pode retornar mais de uma coluna, faça ele te retornar uma lista, uma lista de strings por exemplo…

Abraço…

Criado 11 de setembro de 2011
Ultima resposta 11 de set. de 2011
Respostas 5
Participantes 2