Olá pessoal, é a primeira vez que uso o Guj. Estou com uma dúvida…
Bom eu sei que quando eu quero pegar o id gerado eu uso:
Int var = rs.getInt(1);
Esse 1 é o índice da minha coluna ?
Porque eu criei outra tabela e coloquei:
NOME, CPF, ID.
Então o meu índice não deveria ser 3 ? Pois ele não acompanha a coluna ?
Porém se eu coloco Int var = rs.getInt(3);
Ele explode um erro de ColumnIndex 3 > 1… Porque ?
Sim, este 1 representa o índice da coluna. No caso vc estaria solicitando a primeira coluna.
Só que este índice nem sempre está relacionado com a posição da coluna no banco de dados.
Se no seu SELECT vc listar as colunas que vc quer, este índice estará relacionado com a posição em que a coluna aparece nesta lista. Por exemplo:
try (final PreparedStatement statement = conn.prepareStatement("SELECT * FROM cliente")) {
final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
System.out.println(resultSet.getInt(3));
}
}
O código acima retorna o resultado desejado, pois o asterisco traz as colunas na ordem em que foram criadas. Porém…
try (final PreparedStatement statement = conn.prepareStatement("SELECT id, cpf, nome FROM cliente")) {
final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
System.out.println(resultSet.getInt(3));
}
}
O código acima gera erro, pois é o nome que está na terceira posição da query e ele não pode ser convertido para int
.
try (final PreparedStatement statement = conn.prepareStatement("SELECT nome FROM cliente")) {
final ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
System.out.println(resultSet.getInt(3));
}
}
O código acima gera o erro que vc mencionou, pois eu estou trazendo apenas uma coluna, mas estou tentando acessar a terceira, isto é, estou tentando acessar o índice de uma coluna que não existe na query.
Por isso eu acredito que o problema pode estar em como vc montou seu SELECT.
Mas imagine que na 3 coluna eu coloquei id que no caso é int… Nao deveria retornar resultset.getint(3) ? Sendo que é o índice ? Sendo que o id esta listado na 3 coluna ?
Se o seu SELECT está correto, com pelo menos 3 colunas, realmente é estranho.
Para te ajudar só eu vendo como vc fez exatamente e testando mesmo. Se quiser, mostra seu código para eu testar.
Create table estado {
Nome…
Local…
Id… Pk
}
Quando eu coloco getInt(1) o resultado vem…
Independentemente da onde a coluna está…
Talvez o Index não tem haver com o jeito que tu cria a tabela… E sim pelo id…
Então, é como eu disse, tem a ver com a ordem das colunas no SELECT.
Se vc mostrar seu código eu posso tentar rodar aqui.
public void salvar_Telefones(Telefone telefones) throws SQLException{
Connection conexao_Banco_Dados = Conexao_Banco_Dados.getConexaoBD();
try{
PreparedStatement stmt = conexao_Banco_Dados.prepareStatement(“insert into”
+ " telefone (telefone_pessoa, telefone_fixo) values "
+ “(?,?)”,PreparedStatement.RETURN_GENERATED_KEYS);
stmt.setString(1, telefones.getTelefone_Fixo());
stmt.setString(2, telefones.getTelefone_Pessoal());
//vamos jogar no banco de dados usando o
comando a baixo
stmt.executeUpdate(); //executar e atualizar la dentro
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
telefones.setId_Telefone(rs.getInt(3));
}
}catch(SQLException error){
throw new SQLException("FALHA AO INSERIR TELEFONE "+error);
}
}
Ah, agora ficou mais claro o seu problema.
O método getGeneratedKeys()
retorna os ids que foram auto-gerados pelo banco. Ou seja, ele retorna apenas uma coluna contendo estes ids.
É por isso que vc vê aquele erro quando invoca getInt(3)
. O correto é usar getInt(1)
mesmo, pois só há uma coluna neste ResultSet
.
Como assim 1 coluna ? Nao sao 3 ?
Não. Quando vc faz isso:
ResultSet rs = stmt.getGeneratedKeys();
Ele retorna apenas um coluna contendo os ids gerados. Dá uma olha na doc:
https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#getGeneratedKeys--
Ah, experimenta colocar um print tipo assim:
ResultSet rs = stmt.getGeneratedKeys();
System.out.println(rs);
Vc vai ver algo assim no console:
LocalResultImpl@1697f2b3 columns: 1 rows: 1 pos: -1
No caso dizendo que só tem uma coluna e uma linha.