Problemas com JDBC

5 respostas
A

Olá,

estou mantendo uma aplicação que utiliza JDBC para acessar um banco de dados Firebird.

Sigo os passos comuns para acessar uma Store Procedure e executo o método statement.executeQuery(“query”) para isto.
O problema é que após executar a tal query nada acontece se eu não der um resultSet.next() no ResultSet retornado pelo método executeQuery;
Efetuei a mesma Store Procedure direto no banco e ela funciona.

Gostaria de saber se é necessário fazer esse .next() realmente…
Até onde eu entendo isto não deveria ser necessário.

Thanks…

5 Respostas

_Renatu

Olá

Recomenda-se usar o prepareCall para chamar Stored Procedures…
aqui tem um exemplo:

http://java.sun.com/docs/books/tutorial/jdbc/basics/sql.html

Se a duvida permanecer, volte a postar

Andre.flu

Vc deve usar ao inves da classe PreparedStatement

CallableStatement call = conn.prepareCall(" sua sp(?,?,?) ");

Onde ? são seus parametros.
E vc deve registrar o retorno numa variavél.

De uma procurada na web de como usar esta classe para obter o parametro conforme sua necessidade.

Um abraço.

A

Este é o esquema do codigo que utilizo:

Class.forName("org.firebirdsql.jdbc.FBDriver");
 Statement stmconexao = null;
 ResultSet rstemp = null;

 aConnection = DriverManager.getConnection(DBURL, USERNAME, PASS);
 stmconexao = aConnection.createStatement();
 passagem = stmconexao.executeQuery(QUERY);
 passagem.next();

Não incluí os try/catch aqui por uma questão de visualização…
Se eu retirar o passagem.next() não será efetuada a consulta sql na store procedure e não será atualizado os dados do banco.

T

É obrigatório usar o “next”. Só pensar no seguinte:

  • Um ResultSet é um objeto que contém o registro corrente de um conjunto de registros que foi obtido por uma query. Pode ser que esse conjunto seja vazio ou não.
  • Quando você cria o ResultSet, ele está vazio e sem o registro corrente. Para carregar o primeiro registro corrente, é obrigatório chamar o “next”. Isso lhe indica se o registro existe (porque “next” retornou “true”), e carrega o registro se ele existir.
  • Mesmo que seja o único registro que é resultado de uma stored procedure, por exemplo.
A

O problema já foi resolvido seguindo as orientações acima.
Agora, continua a minha dúvida pois a execução da query devia er teoricamente independente da consulta dos resultados obtidos nela.
Tanto que utilizando o esquema indicado consegui o resultado esperado sem executar o .next() do result set.
Fica a discussão :slight_smile:

Criado 4 de abril de 2007
Ultima resposta 4 de abr. de 2007
Respostas 5
Participantes 4