Erro em metodo que retorna ResultSet

4 respostas
S

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
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();
        }
     
     } }

METODO

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;
    }

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

4 Respostas

Ana.Pandini

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.

S

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:

davidbuzatto

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!

Ana.Pandini

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.

Criado 18 de novembro de 2007
Ultima resposta 21 de nov. de 2007
Respostas 4
Participantes 3