Erro ao tentar alterar contato no banco [RESOLVIDO]

9 respostas
E

Bom dia galera, estou com um probleminha no código java em que faz a alteração de um contato no banco de dados. Abaixo segue minhas implementações:

Método altera no DAO:

public void altera (Contato contato){
String sql = “update contatos set id=?, nome=?, email=?, endereco=?, dataNascimento=?, where id=?”;

try{
		PreparedStatement stmt = (PreparedStatement) connection.prepareStatement(sql);
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
		stmt.setLong(5, contato.getId());
		stmt.setLong(6, contato.getId());

		stmt.execute();
		stmt.close();
		
	} catch (SQLException e){
		throw new RuntimeException(e);
	}

Código main:

public class TestaAltera {

public static void main(String[] args) throws SQLException {
	//pronto para gravar
			Contato contato = new Contato();
			contato.setNome("Edyfran");
			contato.setEmail("[email removido]");
			contato.setEndereco("R. Tenente Alvino");
			contato.setDataNascimento(Calendar.getInstance());
			contato.setId(1);
			
			
			//grave essa conexão
			ContatoDao dao = new ContatoDao();
			
			//método elegante
			dao.altera(contato);
			
			System.out.println("Alterado");

}

}

Erro:

Exception in thread main java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near where id=1 at line 1

at br.com.caelum.jdbc.dao.ContatoDao.altera(ContatoDao.java:95)

at br.com.caelum.jdbc.teste.TestaAltera.main(TestaAltera.java:25)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near where id=1 at line 1

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

at java.lang.reflect.Constructor.newInstance(Unknown Source)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)

at com.mysql.jdbc.Util.getInstance(Util.java:386)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)

at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)

at br.com.caelum.jdbc.dao.ContatoDao.altera(ContatoDao.java:91)

 1 more

9 Respostas

S

Algumas coisas:

Primeiro, sempre coloque seu código entre as tags code.

Agora quanto ao seu problema:

Sua query está assim:

update contatos set id=‘Edyfran’, nome=‘[email removido]’, email=‘R. Tenente Alvino’, endereco=‘1379341325273’, dataNascimento=1, where id=1

Uma outra coisa, declare a variável do PreparedStatement fora do bloco try e adicione um bloco finally para fechar os recursos que estão sendo usados (no caso, o PreparedStatement o Connection).

E

Desculpa sobre as tags. Sou novo aqui. Como também estou aprendendo java agora. Como eu faço para colocar o bloco finally?

S
public void altera (Contato contato){ 
String sql = "update contatos set id=?, nome=?, email=?, endereco=?, dataNascimento=?, where id=?"; 
PreparedStatement stmt = null;
try{ 
stmt = (PreparedStatement) connection.prepareStatement(sql); 
stmt.setString(1, contato.getNome()); 
stmt.setString(2, contato.getEmail()); 
stmt.setString(3, contato.getEndereco()); 
stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis())); 
stmt.setLong(5, contato.getId()); 
stmt.setLong(6, contato.getId()); 

stmt.execute(); 
stmt.close(); 

} catch (SQLException e){ 
throw new RuntimeException(e); 
} finally {
if(stmt != null) {
stmt.close();
}
}
E

Fiz isso, mas continua dando o mesmo erro.

drsmachado

Quando você tentar usar JDBC, primeiro execute a query no programa que você usa para gerenciar o teu banco de dados, depois, copie-a e transforme-a de acordo com o que precisar.
Veja que tua query possui uma vírgula antes do where…

String sql = "update contatos set id=?, nome=?, email=?, endereco=?, dataNascimento=?, where id=?";

E, para aprender a usar as tags, basta citar minha respostas e ver como elas são empregadas.
Se você remover a vírgula que antecede a palavra reservada WHERE, com certeza não terá mais esse erro (pode ter outros, mas este não).

E

Obrigado. Não acredito que o erro era somente por causa de uma vírgula. Resolvido o problema.

S

Como que deu certo se o seu primeiro interrogação, que é o id, está sendo substituído pelo nome do contato?

drsmachado

Por isso eu disse que tratando a vírgula, não ocorreria mais aquele erro…
Agora, tem que ver os outros que poderiam vir…

E

Eu já havia ajeitado a questão do posicionamento. Quando retirei a vírgula, alterou.

Criado 16 de setembro de 2013
Ultima resposta 16 de set. de 2013
Respostas 9
Participantes 3