Retornando um ResultSet

4 respostas
G
Ola. Tenho uma função que deve retornar um ResultSet. Compilei ela e tudo ocorreu bem, porém quando vou utilizar, em outra função, aparece um erro me informando que o ResultSet está fechado.





A função é a seguinte





    public ResultSet executeString(String stringSQL){


        try{


            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");


        }catch (Exception e){


            System.out.println(e);


        }


        Statement cmdTmp = null;


        ResultSet myTab = null;


        Connection dbIntranet = null;





        try {


            dbIntranet = DriverManager.getConnection(dbODBC,dbUser,dbPass);


            cmdTmp = dbIntranet.createStatement();


        }catch (Exception e){


            System.out.println(e);


        }


        try {


            myTab = cmdTmp.executeQuery(stringSQL);


            dbIntranet.close();


        }catch (Exception e){


            System.out.println(e);


        }


        return(myTab);


    }





Tenho essa função em VB, e para funcionar em VB precisei setar uma propriedade chamada CursorLocation para o cursor apontar para o cliente e não para o servidor. Devo fazer algo parecido em Java? Qual o comando?


Obrigado

4 Respostas

F
Tenta remover o comando dbIntranet.close(). Acho que ali vc corta a conexão do ResultSet com o banco.


   Uma sugestão, usa CachedRowSet. É o equivalente a um ResultSet desconectado. Um exemplo genérico:





public static synchronized CachedRowSet retornaDados(String query) throws SQLException, Exception{





		Connection connection = null;


		try{


			Class.forName ("com.sap.dbtech.jdbc.DriverSapDB");			


			connection =DriverManager.getConnection (url,user_name, password);		


			Statement stmt = connection.createStatement ();			


			ResultSet resultSet = stmt.executeQuery(query);


						


			CachedRowSet crset = new CachedRowSet();


			crset.populate(resultSet);


				


			resultSet.close();


			stmt.close();


			


			if (connection != null) connection.close();						


			return crset;


			


		}catch(SQLException ex){


			ex.printStackTrace();						


		}catch(Exception e){


			e.printStackTrace();


		}


	}





Dessa maneira vc tem os dados e a conexão com o banco liberada! A lib dessa classe vc encontra na página da Sun.





Adriano.
G

Valeu Adriano.

vou tentar usar o CachedRowSet, mas quanto a sua outra sugestão, acho que não posso tirar o dbIntranet.close(); porque senão vou deixar a conexão em aberto, ou estou errado?



A chamada dessa função não está na mesma classe, mas sim em uma página JSP.



Gustavo

P

O ResultSet normal do JDBC nao eh desconectado, ou seja, ele nao eh uma copia para os dados do seu banco de dados, mas apenas uma representacao em java do cursor de banco.



Se voce quiser manipular seus dados de forma desconectadas, entao algumas sugestoes. Uma delas ja foi dada acima, que eh a utilizacao do CachedRowSet. A outra, eh definir uma classe que representa o seu objeto de negocio, e retornar uma Collection desses objetos.



Algo do tipo…

Code:


ResultSet rs = statement.executeQuery();

Collection clientes = new ArrayList();

while (rs.next())

{

Cliente cliente = new Cliente();

cliente.setNome(rs.getString("nome"));

cliente.setTelefone(rs.getString("telefone"));



clientes.add(cliente)

}



return clientes;



Dessa forma voce esta retornando para a sua camada de interfaces objetos de negocio, e nao objetos de banco de dados. Isso torna mais clara a separacao entre persistencia (DB) e logica (negocio).
G
Tbm estou com a mesma dúvida com ResultSet!!!


Tenho minha Regra de negócio Produto, Estoque





Interface Alterar Produto precisa obter os dados.





Tenho minha camada de Persistencia PersisteToAccess.java


que tem esse método para fazer consulta


	public void localizarProduto(int Codigo){


		try


		{


			   Conexao conexao = new Conexao();


			   conexao.stm = conexao.connection.createStatement();


		       //ResultSet rs = null;


			   String query = "SELECT * FROM Produto WHERE Codigo = " + Codigo;


			   ResultSet result = conexao.stm.executeQuery(query);


		    	


		


		       System.out.println("query : " + query);


		       conexao.connection.close();			


		


	   }


	   catch(SQLException e){


	       System.out.println(e);


	   }


			//return p;


	}





no qual  não sei como fazer para retornar esse resultado para a Interface, nos TextField





como faço para mandar para o TextField para fazer o Update???
Criado 27 de março de 2003
Ultima resposta 20 de jun. de 2003
Respostas 4
Participantes 4