Solucionado (ver solução)
Solucionado
(ver solução)
14
respostas

Dúvida no Ex. 2 da Aula 2 - Inserindo e removendo dados

Neste Exercicio, para retornamos o ID, usamos a seguinte sintaxe abaixo:

        ResultSet resultSet = statement.getGeneratedKeys();
       while (resultSet.next()) {
            String id = resultSet.getString("id");
            System.out.println(id + " gerado");
        }

Porém só consegui retornar usando o indice numerico e nao o literal:

        ResultSet resultSet = statement.getGeneratedKeys();
       while (resultSet.next()) {
            String id = resultSet.getString(1);
            System.out.println(id + " gerado");
        }

Alguem passou por esta situação ???

14 respostas

Oi Bruno,

Sua coluna chama-se "id" no banco de dados mesmo? Tudo em minúsculo?

Sim, chama-se "id", no banco de dados ela esta em maiuscula, porem cheguei a realizar os seguintes testes, sem sucesso.

String id = resultSet.getString("id"); ou String id = resultSet.getString("Id"); ou String id = resultSet.getString("ID");

O Teste de Listagem, retorna sem problemas, pelo nome da Coluna.

ResultSet resultset = statement.getResultSet();

while (resultset.next()) { String id = resultset.getString("id"); System.out.println(id); String nome = resultset.getString("nome"); System.out.println(nome); String descricao = resultset.getString("descricao"); System.out.println(descricao); }

Bom dia Bruno,

Por algum motivo seu banco não deve estar retornando os metadados, que dizem qual coluna é qual no retorno dos dados. Para as outras colunas também não funciona, isso?

Abraçø

O problema acontece apenas na execucao de insercao, quando tento recuperar o valor do ID, conforme descrito abaixo:

ResultSet resultSet = statement.getGeneratedKeys(); resultSet.next(); String id = resultSet.getString("id");

O Banco de Dados que estou utilizando é o MySQL.

Bom dia Bruno,

Confere que a criação do statement passa os parâmetros adequados? Pois na criação dele é necessário pedir que o server devolva as chaves.

Att

Sim , está correto, a codificao, teria algo ver com a versão do Java, estou utilizando a última versão do Eclipse Luna. E estou utilizando o banco de dados do MySql.

O Java não deveria influenciar. Pode compartilhar o código todo por favor?

Ola Guilherme desculpa a demora, segue o codigo da Classe Testa Inserção:

package br.com.nead.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestaInsercao {
    public static void main(String[] args) throws SQLException {
        try(Connection conexao = DataBase.getConnection()){
            conexao.setAutoCommit(false);
            String sql = "insert into produto(nome, descricao) values (?, ?)";
            try(PreparedStatement statement = conexao.prepareStatement(sql, 
                    Statement.RETURN_GENERATED_KEYS)){                            
                adiciona("TV LCD", "32 Polegadas", statement);
                adiciona("Blueray", "Full HDMI", statement);            
                conexao.commit();
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                conexao.rollback();
                System.out.println("Rollback efetuado");
            }
        }
    }

    private static void adiciona(String nome, String descricao,
            PreparedStatement statement) throws SQLException {
        statement.setString(1, nome);
        statement.setString(2, descricao);

        boolean resultado = statement.execute();
        System.out.println(resultado);

        ResultSet resultset = statement.getGeneratedKeys();

        while (resultset.next()) {
            Integer id = resultset.getInt(1);
            System.out.println(id + " gerado");

        }

        resultset.close();
    }
}

Então Brunão,

Isso é algum problema de integração com o MySQL, alguma implementação diferente dentro do JDBC desse banco. Não se preocupa não, pois eu passei por isso, dei um pesquisada e também só consegui fazer funcionar do mesmo jeito que você.

Tudo em casa cara... Pode ficar tranquilo!

Bruno,

Sua coluna "id" é de qual tipo? Você está tentando fazer rs.getString("id") mas se ela for do tipo Integer ou intpor exemplo, vc deveria fazer rs.getInt("id").

Abraço!

Bom dia Joviane,

Eu já tentei de todos os jeitos, e não funciona mesmo utilizando o nome da coluna como referência.

O StackTrace retorna que a coluna ID não foi encontrada dentro do ResultSet, e por isso o erro.

Eu só consegui fazer funcionar utilizando o índice da coluna, igual a solução do Bruno, no caso:

ResultSet resultSet = statement.getGeneratedKeys();
while (resultSet.next()) {
    String id = resultSet.getString(1);
    System.out.println(id + " gerado");
}

Abraços.

de acordo com a implementação do JDBC do mySql, para você "resgatar" o id, use resultSet.getString("GENERATED_KEY").

solução!

Agradeços a todos que participarão deste forum, o questionamento realizado, não tem impactos no projeto, a ponto de não conseguirmos concluir a aplicação. Porem aprendemos duas Soluções Alternativas:

ResultSet resultset = statement.getGeneratedKeys();

while (resultset.next()) {

Integer id = resultset.getInt("GENERATED_KEY"); System.out.println(id + " gerado");

}

ou

ResultSet resultset = statement.getGeneratedKeys();

while (resultset.next()) {

Integer id = resultset.getInt(1); System.out.println(id + " gerado");

}

acho que desta maneira você me omitiu como o a pessoa que respondeu sua dúvida ='(