Ajuda para encontrar erro no código SQL[RESOLVIDO]

5 respostas
P
Ola, Tenho uma classe AlunoDAO onde o método de salvar esta acusando erro de sintaxe SQL,o código do meu método é o seguinte:
public void salvar(Aluno a) throws Exception
	{
		try
		{
			PreparedStatement ps = conexao.prepareStatement("insert into aluno (nome,data_nascimento,naturalidade,nacionalidade,nome_pai,nome_mae,estado_civil,endereco_residencial,endereco_profissional,telefone_residencial,telefone_profissional,cpf,rg,orgao_emissor,titulo,zona,secao,turno,num_carne,profissao,turma,sexo,aproveitamento,status) values ('"+ a.getNome() +"','"+ a.getData_nascimento() +"','"+ a.getNaturalidade() +"','"+ a.getNacionalidade() +"','"+ a.getNome_pai() +"','"+ a.getNome_mae() +"','"+ a.getEstado_civil() +"','"+ a.getEndereco_residencial() +"','"+ a.getEndereco_profissional() +"','"+ a.getTelefone_residencial() +"','"+ a.getTelefone_profissional() +"','"+ a.getCpf() +"','"+ a.getRg() +"','"+ a.getOrgao_emissor() +"','"+ a.getTitulo() +"','"+ a.getZona() +"','"+ a.getSecao() +"','"+ a.getTurno() +"','"+ a.getNum_carne() +"','"+ a.getProfissao() +"','"+ a.getTurma() +"','"+ a.getSexo() +"','"+ a.getAproveitamento() +"','"+ a.getStatus() +"') ");
			ps.executeUpdate();//o erro aponta para esta linha aqui 
		}
		catch(SQLException e)
		{
			e.printStackTrace();

			throw e;
		}
	}
O erro que esta aparecendo no console é este:
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 ''brasileiro','Juliano da Silva','Julia da Silva','soleiro','NI','NI','(51)3592-8' 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:2568)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2409)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312)
	at AlunoDAO.salvar(AlunoDAO.java:126)
	at Cadastro$4.actionPerformed(Cadastro.java:460)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)...

Eu não posso executar este comando?ps.executeUpdate();
Obrigada pela ajuda

5 Respostas

lucas_carvalho100

Primeira coisa, antes de procurar o erro mude uma “coisinha”

Quando você o PreparedStatement, você deve usar assim por exemplo:

String sql = "insert into tabela 1 (campo1,campo2) values (?,?);
PreparedStatement ps = conexao.getConnection().prepareStatement(sql);
ps.setInt(1,10);
ps.setString(2,"exemplo");
ps.executeUpdate();

Dessa forma seu código fica muito, mas muito mais legível…

drsmachado

1 Você usa o preparedStatement e não utiliza a sintaxe correta, por que?

PreparedStatement ps = conexao.prepareStatement(
"insert into aluno
(nome,data_nascimento,naturalidade,nacionalidade,nome_pai,nome_mae,estado_civil,
endereco_residencial,endereco_profissional,telefone_residencial,telefone_profissional,
cpf,rg,orgao_emissor,titulo,zona,secao,turno,num_carne,profissao,turma,sexo,aproveitamento,status)
values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
ps.setString(1, a.getNome());
ps.setDate(2, new java.sql.Date(a.getData_nascimento().getTime());
//assim por diante
ps.executeUpdate();
leoramos

Já que você tá usando preparedStatement, aproveite pra setar teus parâmetros através dele.
Uma String desse tamanho não dá sem um bocado de esforço. Debuggando já dá trabalho, mas isso aí é covardia. Provavelmente é algum desses parẽnteses ou aspas que estão no SQL que estão te quebrando as pernas.
Se não quiseres mudar isso, pega a string gerada e executa no teu banco diretamente, fica mais fácil de descobrir um erro de sintaxe do SQL, como é o teu caso - até pq, no Java, o erro sempre é gerado na ‘linha 1’, já que pra ele a String é de uma linha só.
Precisar de mais ajuda, só falar

drsmachado

Outra coisa, pelo erro gerado, o valor informado para a coluna telefone_residencial está errado.
Ou a coluna é de um tipo diferente de text/varchar ou o length passado é maior que o que ela suporta.

P

meninos voces tem razão alterei meu código lá conforme voces me disseram e agora esta funcionando certinhoooooooo!
muito obrigada pela ajuda!
Ah o código ficou assim:

PreparedStatement ps = conexao.prepareStatement("insert into aluno (nome,data_nascimento,naturalidade,nacionalidade,nome_pai,nome_mae,estado_civil,endereco_residencial,endereco_profissional,telefone_residencial,telefone_profissional,cpf,rg,orgao_emissor,titulo,zona,secao,turno,num_carne,profissao,turma,sexo,aproveitamento,status) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) "); ps.setString(1, a.getNome()); ps.setString(2, a.getData_nascimento()); ps.setString(3, a.getNaturalidade()); ... ps.executeUpdate();
Obrigada pela ajuda e explicações!!!
Att,

Criado 29 de julho de 2011
Ultima resposta 29 de jul. de 2011
Respostas 5
Participantes 4