Parametro "?" na insercao de dados [resolvido]

Caros colegas,

Preciso de uma força, não estou conseguindo usar corretamente o parametro ? no prepareStatement na inserção de dados. Sei que meu erro é simples, já olhei na apostila da Caelum e aparentemente está tudo certo. Atualizei o driver mysql.java.5.1.17 e ainda ocorre o mesmo erro. Já fiz rodar de diversas maneiras, porém quando uso o parametro “?” na string sql ocorre o erro abaixo:

exception in thread “main” 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 ‘?, ?)’ at line 1

Segue o código:

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

public class Operacao {

private PreparedStatement dado;
private String sql;
private Connection con;

public Operacao () throws Exception{
	this.con = FabricaDeConexao.getConnection();
}

public void adiciona() throws SQLException{
	
	DadosLogin dados = new DadosLogin();
	dados.setNome("IBTA");
	dados.setSenha("222");
	
	/*sql = "insert into login values ('"+dados.getNome()+"','"+dados.getSenha()+"')";*/
	
	[b]sql = "insert into login(nome, senha) values(?, ?)";[/b]
    dado = con.prepareStatement(sql);
	dado.setString(1,dados.getNome());
	dado.setString(2,dados.getSenha());
	dado.executeUpdate(sql);
	
	dado.close();
	}

Me dê uma ajuda, por favor?

Está correto. Você tem certeza de que o nome da tabela e o nome dos campos estão corretos? Experimente trocar o dado.executeUpdate(sql) por dado.execute().

colega,

Estou fazendo correto e já troquei o execute.query por execute…e nada…tenho certeza da tabela pois já inseri os dados sem o parametro ? com o mesmo código…

André,

Se eu tirar a linha comentado, ou seja, se usar o código da linha comentada funciona normalmente.

Grato,

Qual o erro gerado?
Tem certeza que o nome das colunas são estes mesmos?

Posta aqui os erros que estão no seu console, porque aparentemente está tudo certo…

Ele já disse qual é:

Eu sinceramente não sei qual é o problema. Vou acompanhar o tópico, para saber.

Cara,

O que mais me estranha que se eu tirar a linha de cometário e fazer pela linha de comentário funciona o banco

a tabela esta correta e o nome das colunas tb

o erro:

Exception in thread “main” 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 ‘?, ?)’ 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:409)
at com.mysql.jdbc.Util.getInstance(Util.java:384)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2512)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:781)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:624)
at Operacao.adiciona(Operacao.java:29)
at BancoOperacao.main(BancoOperacao.java:17)

Tua string está exatamente assim?

sql = "insert into login(nome, senha) values(?, ?)";

Se sim, tenta separar a palavra reservada VALUES do parenteses

sql = "insert into login(nome, senha) values       (?, ?)";

E testa

Ja dei os espaços e nada…o que está me surpreendendo é o fato de funcionar com

sql = “insert into login (nome, senha) values (”+dado.getString(nome)+“dado.getString(senha)+”)";

dessa maneira funciona e consigo cadastrar no banco as informações…

mas quando uso o ?

com dado.setString(1, dado.getString(nome)); e com o da senha não funciona…

Cara, debuga essa parte e manda o valor do preparedStatement após isto

dado.setString(2,dados.getSenha());

Para que seja possível ver qual a sintaxe que o java tá criando para a query

coloca um try/catch e debuga como drsmachado falou, tá com cara de bug do mysql…

Pessoal,

eu fiz o que me disseram e rodou. Na verdade o erro estava no método da classe jav.sql e não java.jdbc …pois fiz clicando no método e funcionou…

grato pela colaboração!

Valew!

Resolvido.