Por Favor será que alguém poderia me
dar uma ajuda? Eu não estou conseguindo
pegar a chave primária da minha tabela
endereco:
CREATE TABLE Endereco (
idEndereco INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
rua VARCHAR(20) NOT NULL,
numero INTEGER UNSIGNED NOT NULL,
bairro VARCHAR(30) NOT NULL,
cidade VARCHAR(20) NOT NULL,
estado VARCHAR(20) NOT NULL,
cep VARCHAR(9) NULL,
uf VARCHAR(2) NULL,
PRIMARY KEY(idEndereco)
)
TYPE=InnoDB;
Mas eu não estou conseguindo retornar
a chave primária idEndereco através do meu
código Java:
public int salvarEndereco(Endereco endereco) throws LAFQADaoException {
PreparedStatement ps = null;
Connection conn = null;
if (endereco == null)
throw new LAFQADaoException("o valor passado não pode ser lido");
try {
String sql = "INSERT INTO endereco(rua, numero, bairro, " +
"cidade, estado, cep, uf)"
+ "VALUES(?,?,?,?,?,?,?)";
conn = this.conn;
ps = conn.prepareStatement(sql);
ps.setString(1, endereco.getRua());
ps.setInt(2, endereco.getNumero());
ps.setString(3, endereco.getBairro());
ps.setString(4, endereco.getCidade());
ps.setString(5, endereco.getEstado());
ps.setString(6, endereco.getCep());
ps.setString(7, endereco.getUf());
//Retorna o id do endereco cadastrado
ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
rs.next();
int id = rs.getInt(1);
rs.close();
//Não retorna o idEndereco, como eu devo fazer para retornar
//a chave primária?
return id;
}
catch (Exception sqle) {
throw new LAFQADaoException("Erro ao inserir dados" + sqle);
} finally {
try {
ConnectionFactory.closeconnection(conn, ps);
}
catch (SQLException ex) {
Logger.getLogger(ProdutorDao.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
coloca o rs.next() (linha30) em um if pra ver se é verdadeiro, e da um system.out ali só pra teste…
caso não esteja entrando no if provavelmente seu campo na tabela do mysql não é auto_increment, se tiver entrando, disconfio também que vc possa precisar de um long, ja que o integer do banco é unsigned… ai vc da um nextLong na linha 31 ao invéz de nextInt…
faz esses testes e volta aki pra ver dizer se funciono…
Jóia pedroroxd e maior_abandonado?
obrigado pela ajuda de vc’s mas ainda eu não consegui,
eu troquei a parte do código para:
int id = rs.getInt(0);
e coloquei um if para testar:
if(rs.next()){
System.out.println("rs.next() é verdadeiro!");
}
e descobrir que o campo do idEndereco é AUTO_INCREMENT sim,
mas do mesmo jeito com todos os testes feito aparece a seguinte Exceção:
java.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
Falha ao cadastrar o usuário!
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2176)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1993)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
at dao.EnderecoDao.salvarEndereco(EnderecoDao.java:57)
at teste.TesteEndereco.main(TesteEndereco.java:38)
22/09/2009 10:00:20 teste.TesteEndereco main
SEVERE: null
dao.LAFQADaoException: Erro ao inserir dadosjava.sql.SQLException: No value specified for parameter 1
at dao.EnderecoDao.salvarEndereco(EnderecoDao.java:72)
at teste.TesteEndereco.main(TesteEndereco.java:38)
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
Obrigado pela ajuda pedroroxd e maior_abandonado,
mas será que um de vc’s dois ou alguém sabe o que eu devo
ter feito de errado?
Eu tô quase fazendo uma consulta
SELECT para pegar a chave primária
atual gerada pelo AutoIncrement do Banco.
Se bem que isso não vai ser eficiente,
mas não estou conseguindo cadastrar
um endereço novo no banco e retornar
a chave primária gerada por aquele
novo endereço.
Olá enantiomero e jgbt,
obrigado pela ajuda mas
pelo jeito eu não estou conseguindo,
já fiz várias alterações aqui
com o material que vc’s me passaram
mas agora apareceu um NullPointerException
e não sei aonde está o problema
o código depois da alteração
que vc’s me falaram ficou assim:
public int salvarEndereco(Endereco endereco) throws LAFQADaoException {
PreparedStatement ps = null;
Statement stmt = null;
ResultSet rs = null;
if (endereco == null)
throw new LAFQADaoException("o valor passado não pode ser lido");
try {
String sql = "INSERT INTO endereco(rua, numero, bairro, " +
"cidade, estado, cep, uf)"
+ "VALUES(?,?,?,?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, endereco.getRua());
ps.setInt(2, endereco.getNumero());
ps.setString(3, endereco.getBairro());
ps.setString(4, endereco.getCidade());
ps.setString(5, endereco.getEstado());
ps.setString(6, endereco.getCep());
ps.setString(7, endereco.getUf());
ps.executeUpdate();
int autoIncKeyFromFunc = -1;
rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
if (rs.next()) {
autoIncKeyFromFunc = rs.getInt(1);
}
else {
throw new LAFQADaoException("Erro ao pegar a chave primaria");
}
rs.close();
System.out.println("Key returned from " +
"'SELECT LAST_INSERT_ID()': " +
autoIncKeyFromFunc);
return autoIncKeyFromFunc;
}
catch (Exception sqle) {
sqle.printStackTrace();
throw new LAFQADaoException("Erro ao inserir dados" + sqle);
}
finally {
try {
ConnectionFactory.closeconnection(conn, ps);
}
catch (SQLException ex) {
Logger.getLogger(ProdutorDao.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Estou precisando de ajuda
não estou mesmo conseguindo resolver este problema.
Por favor pessoal.
[]'s.
E quanto ao que o jgbt falou. Da mesma forma que achei que você não tinha instanciado sua conexão, eu não vi no código que você postou acima, nos ultimos posts, se você instanciou o Statement.
acho que você apagou isso sem querer do seu código,
conn = this.conn;
ps = conn.prepareStatement(sql);
pois no código do início do post vc instanciou, e no código q postou por último, não tava instanciado.
OUTRO EDIT: No lugar do stmt, não seria ps ?
int autoIncKeyFromFunc = -1;
rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
Se continuar o erro, posta aqui a saida do stackTrace.
Obrigado mesmo a todo mundo que me ajudou
agora deu certo. Graças a Deus. =D.
Eu vou postar o meu código aqui pq se algum dia
alguém tiver a mesma dúvida que eu tive ele poderá ajudar. =D.
public int salvarEndereco(Endereco endereco) throws LAFQADaoException {
PreparedStatement ps = null;
ResultSet rs = null;
if (endereco == null)
throw new LAFQADaoException("o valor passado não pode ser lido");
try {
String sql = "INSERT INTO endereco(rua, numero, bairro, " +
"cidade, estado, cep, uf)"
+ "VALUES(?,?,?,?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, endereco.getRua());
ps.setInt(2, endereco.getNumero());
ps.setString(3, endereco.getBairro());
ps.setString(4, endereco.getCidade());
ps.setString(5, endereco.getEstado());
ps.setString(6, endereco.getCep());
ps.setString(7, endereco.getUf());
ps.executeUpdate();
stmt = (Statement) conn.createStatement();
int autoIncKeyFromFunc = -1;
rs = stmt.executeQuery("SELECT LAST_INSERT_ID() FROM endereco");
if (rs.next()) {
autoIncKeyFromFunc = rs.getInt(1);
}
else {
throw new LAFQADaoException("Erro ao pegar a chave primaria");
}
rs.close();
System.out.println("Key returned from " +
"'SELECT LAST_INSERT_ID()': " +
autoIncKeyFromFunc);
return autoIncKeyFromFunc;
}
catch (Exception sqle) {
sqle.printStackTrace();
throw new LAFQADaoException("Erro ao inserir dados" + sqle);
}
finally {
try {
ConnectionFactory.closeconnection(conn, ps);
}
catch (SQLException ex) {
Logger.getLogger(ProdutorDao.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
ola pessoal, estou trabalhando com MYSQL
preciso INSERT INTO endereco pessoa e paciente, pegando o id da anterior
tentei usar o LAST INSERT_ID() mas não esta roalndo, alguem tem ideia sobre o assunto,
obs. quando o INSERT é uma só classe esta rolando…