Erro no PreparedStatement

Pessoal,

No meu PreparedStatement, pra ser mais preciso após o executeQuery dou um first() para o ponteiro ir no 1º registro, mas o estranho que está dando um erro muito estranho:

The requested operation is not supported on forward only result sets.

O meu código é o seguinte:

[code]String sql = "SELECT codlistfuncao,codceninf,codfuncao "+
"FROM rellistfuncao "+
“WHERE codceninf = ?;”;

	try {
		java.sql.PreparedStatement ps = conecta.getPreparedStatement(sql);
		
		ps.setInt   (1, centinf.getCodceninf());
		ResultSet resultado =  ps.executeQuery();
		resultado.first();

	} catch (ClassNotFoundException e) {
		retorno = false;
		e.printStackTrace();
	}finally{
		conecta.desconectar();
	}

[/code]

Alguém sabe pq ??

Obrigado

Apenas como palpite,

sua instrução SQL está levando um “;” no final e isso pode causar um erro no momento da execução não
obtendo assim um Set de resultados e ao tentar o first ele não tem o que apontar!

Tente retirar esse ; e poste o resultado.

Valeu

Tentei e deu o mesmo erro.

Alguma outra ideia ?

Obrigado

Depois que você executa a consulta, o preparedStatement já está posicionado antes do primeiro registro.

Portanto, ao invés de first() você deve chamar next() para posiciona-lo no primeiro registro. next() retorna true se foi possível andar sobre o statement, ou false, caso tenha sido impossível (ou seja, se não havia um registro na próxima posição).

O comando first() só existe em PreparedStatements que sejam navegáveis para frente e para trás. Normalmente, não é necessário criar esse tipo de cursor no banco, pois só lemos os dados do primeiro até o último. Caso isso seja realmente necessário, você tem que criar o PreparedStatement assim:

conn.preparedStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Matou a pau!

Realmente, era isso mesmo…

O meu código ficou assim:

public PreparedStatement getPreparedStatement(String SQL) throws SQLException, ClassNotFoundException { PreparedStatement ps = getConexao().prepareStatement(SQL,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ps.setMaxRows(100); return ps; }

Obrigado

Verifique com muito carinho se não é melhor continuar usando um PreparedStatement que não seja scrollable. Geralmente ele é desnecessário. Além de consumir muito mais recursos do banco, esse tipo de statement é consideravelmente mais lento. Sem falar que alguns BDs podem não suporta-lo.