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)
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.
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.)
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?
Qual a versão do Driver/Mysql voce esta utilizando?
Ja tentou usar
ps.setInt(5, bean.getOrcamento().getNatureza().getNaturezaid());
ps.executeUpdate(); //Tenta Assim
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|
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