Erro em metodo que retorna ResultSet

Estou com um problema em meu metodo que retorna um ResultSet, não sei se devo substituir os ResultSet por Arrays.

SERVLET QUE CHAMA O METODO

[code]import java.io.;
import java.net.
;
import javax.servlet.;
import javax.servlet.http.
;
import java.sql.;
import banco.
;

public class Chamado extends HttpServlet
{
public void doGet (HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException

{
PrintWriter out;
res.setContentType(“text/html”);
out = res.getWriter();

 try {
ResultSet rs_grupo = null;  
Atendimento novoatendimento = new Atendimento();   
rs_grupo = novoatendimento.ExibirChamadoGrupo(1);
   
if(rs_grupo.next()) 
   {
     out.println("uma linha foi retornada.");                  
  }
  else
  {
    out.println("não retornou nada");
  }
   } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }
 
 } }[/code]

METODO

[code] public ResultSet ExibirChamadoGrupo(int sg_id) throws SQLException
{

       PreparedStatement ps = null;     
       Connection con = null;    
       ConexaoBanco Banco = new ConexaoBanco();
       ResultSet chamado_grupo = null;;
    try {            
        con = Banco.getConexao();
  
   ps=con.prepareStatement("select cha_id, cha_data, cat_id, cha_desc from chamado where sg_id =?");
   ps.setInt(1,sg_id);

   chamado_grupo = ps.executeQuery();
    
        } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } catch (SQLException ex) {
        ex.printStackTrace();
  
    }
  return chamado_grupo;
}
[/code]

Realmente estou quebrando bastante a cabeça com isso… o erro que retorna é informando que o " rs_grupo" está nulo, porem o sql está correto retorna valor

Não tenho como testar nada agora, mas acredito que desse jeito funcione…

No método, linha 14 (chamado_grupo = ps.executeQuery(); ) está um erro.
Você deveria passar o comando sql nesse executeQuery, que está retornando null devido à isso.
Outra coisa, não use prepareSatement nesse caso.

Retire as linhas 4 e 5 do método, e entre as linhas 7 e 8 coloque:

Statement stGrupo = Banco.getConexao.createStatement();

Dentro do try/catch faça então:

chamado_grupo = stGrupo.executeQuery(“select cha_id, cha_data, cat_id, cha_desc from chamado where sg_id =?”);

Talvez, se você tivesse depurado, teria visto que a sua variável chamado_grupo estava nula já na linha 14.

mas o ps.executeQuery(); está executando a PreparedStatement que fiz ali pra evitar SQL injection o problema

fiz o que falou e não deu certo :frowning:

A chamada a executeQuery está correta. Ana, dê uma olhada na API ok?

O erro tem uma causa um tanto sutil.

Repare a forma que você implementou seu método. Dentro dele vc cria sua conexão certo? E retorna um ResultSet que está AMARRADO a conexão criada. Quando seu método termina, os objetos criados dentro dele são destruídos (olha o escopo!) menos o que é representado pela referência retornada (que no caso é o ResultSet). É ai que está o problema. Sua conexão sendo destruída, ele é fechada automaticamente, e como seu ResultSet é amarrado a conexão, esse “para” de funcionar entendeu? O ResultSet depende da conexão. Se ela é fechada, adeus ResultSet.

O que eu aconselho:

[list]No seu método, ao invés de retornar um ResultSet, retorne um ArrayList com os dados da consulta, ou[/list]
[list]Dê uma olhada na API beanutils do projeto commons da apache, lá existe um “ResultSet” que fica “independente” da conexão (RowSetDynaClass).[/list]

Você pode também melhorar sua camada de acesso a banco utilizando o padrão DAO por exemplo. Dê uma olhada na apostila de desenvolvimento web da Caelum, lá tem um exemplo básico.

Até mais!

Desculpe então suprman, eu realmente não havia notado
que a sua conexão estava sendo destruída.
Irei sim dar uma olhada com atenção na API, porém possuo métodos que retornam ArrayList que usam a executeQuery() passando já o comando sql e funcionam normalmente.
Obrigada pela dica, vou estudar isso.