Problema ao tentar recuperar o ultimo id persistido com a função: getGeneratedKeys();

6 respostas
I

Alguém sabe porque o meu PreparedStatement não está conseguindo pegar o ultimo id inserido? e tem alguma alternativa?
Se alguem ja passou por esse problema usando JDBC, qual foi a solução encontrada?

public void incluirPeloTermo(TermoVO bean) {
		Connection con = DAO.getConexao();
		String sql = "insert into " +
		"orcamento(funcaoid,subfuncaoid,programaid,projeto_orcid,naturezaid)" +
		"values(?,?,?,?,?)";
		try {
			PreparedStatement ps = con.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
			ps.setInt(1, bean.getOrcamento().getFuncao().getFuncaoid());
			ps.setInt(2, bean.getOrcamento().getSubfuncao().getSubfuncaoid());
			ps.setInt(3, bean.getOrcamento().getPrograma().getProgramaid());
			ps.setInt(4, bean.getOrcamento().getProjeto_orc().getProjeto_orcid());
			ps.setInt(5, bean.getOrcamento().getNatureza().getNaturezaid());
			ps.execute();
			
			ResultSet rs = ps.getGeneratedKeys(); 
			while(rs.next()){
			orcamentoid = rs.getInt(1);
			}
			
			rs.close();
			ps.close();
		} catch (SQLException e) {
			System.out.println("Erro na Insercao de orcamento");
			e.printStackTrace();
		}
	}

Segue o erro:

java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)

6 Respostas

A

Cara, ainda não analisei tudo, mas verifica o teu sql primeiro, tu tá com o insert assim:

String sql = "insert into orcamento(funcaoid,subfuncaoid,programaid,projeto_orcid,naturezaid)values(?,?,?,?,?)"
//você não deu o espaço na tua linha do mysql
//deixa ele assim -- ou de qualquer forma que dê o espaçamento necessário
String sql = "insert into" +  
        " orcamento(funcaoid,subfuncaoid,programaid,projeto_orcid,naturezaid)" +  
        " values(?,?,?,?,?)";

talvez isso já seja o erro, porque ele não vai nem chegar a inserir o valor.

E

Não tem nada a ver. O que acredito que ocorreu é que você tenha, por algum bug do JDBC Driver do MySQL, especificar executeUpdate em vez de execute (apesar desse nome, você pode usar o executeUpdate para inserção também.)

I

Valew pela atenção pessoal! Quanto ao espaçamento do SQL, não da problema não…ele funciona assim msm, mas de qq forma irei colocar para ficar mais elegante.
Eu troquei o execute() pelo executeUpdate() e continua dando o erro…tentei colocar a constante que pede a generatedKey nele também, ficou assim:

ps.executeUpdate(sql,PreparedStatement.RETURN_GENERATED_KEYS);

Não funcionou tbm! Ja pesquisei vários exemplos na net e nenhum funciona, fiz até esse sem noção aqui:


http://www.java2s.com/Code/Java/Database-SQL-JDBC/DemoGetGeneratedKeysMySQL.htm

E mesmo assim nada…será que vou ter que recorrer a gambiarra de fazer uma consultar após o insert só para trazer o ID?

mathiasnw

Qual a versão do Driver/Mysql voce esta utilizando?

Ja tentou usar

ps.setInt(5, bean.getOrcamento().getNatureza().getNaturezaid());  
             ps.executeUpdate(); //Tenta Assim
I

mathiasnw a versão que eu estou usando é a 5.1.12 , e sim, eu tentei desta forma que voce indicou…continua dando o erro! x|

I

Quando eu debugo e dou um “inspect” na variavel ps, eu encontro 2 atributos que me chamam atenção:

  • lastInsertId = que realmente pega o safado do ultimo id inserido!
  • retrieveGeneratedKeys = que é um boolean, que fica setado “false”

Alguém sabe como eu acesso essas propriedades?? to procurando que nem loco aqui e nao axo! O.x

Criado 12 de julho de 2010
Ultima resposta 12 de jul. de 2010
Respostas 6
Participantes 4