[RESOLVIDO]Problema ao inserir registro com preparedstatement

Bom dia pessoal,

estou com o seguinte problema… tenho o codigo :

[code]
public String insere(Maquina m){

    String sql = "INSERT INTO maquina("
            + "nro_serie, "
            + "descricao, "
            + "ativo, "
            + "caracteristicas, "
            + "id_grupo, "
            + "id_subgrupo, "
            + "id_fornecedor, "
            + "modelo, "
            + "id_marca, "
            + "codigo, "
            + "id_cliente, "
            + "data_inclusao, "
            + "id_usuario "
            + ")VALUES("
            + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    
    try {
        
        PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

        stmt.setString(1, m.getNro_serie());
        stmt.setString(2, m.getDescricao());
        stmt.setInt(3, m.isAtivo()?1:0);
        stmt.setString(4, m.getCaracteristicas());
        stmt.setInt(5, m.getId_grupo());
        stmt.setInt(6, m.getId_subgrupo());
        stmt.setInt(7, m.getId_fornecedor());
        stmt.setString(8, m.getModelo());
        stmt.setInt(9, m.getId_marca());
        stmt.setString(10, m.getCodigo());
        stmt.setInt(11, m.getId_cliente());
        stmt.setString(12, m.getDataInclusao());
        stmt.setInt(13, m.getId_usuario());
        
        stmt.execute(sql);
        
        ResultSet rs = stmt.getGeneratedKeys();
        int idGerado = 0;
        if (rs.next()) {
            idGerado = rs.getInt(1);
        }
        rs.close();
        
        if (idGerado != 0 && m.getListaAtividadeMaquina() != null) {
            daoAtividadeMaquina.inserir(m.getListaAtividadeMaquina(), idGerado);
        }
        
        stmt.close();
        return "true";
    } catch (Exception e) {
        e.printStackTrace();
        return e.getMessage();
    }
    
}[/code]

porém o mesmo não consegue executar o sql trazendo o seguinte erro:
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(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
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 cpadivisual.persistencia.dao.DaoMaquina.insere(DaoMaquina.java:61)
at cpadivisual.controle.ColMaquina.salvar(ColMaquina.java:56)
at cpadivisual.apresentacao.cad.CadMaquina.salvar(CadMaquina.java:1690)
at cpadivisual.apresentacao.cad.CadMaquina.access$1200(CadMaquina.java:89)
at cpadivisual.apresentacao.cad.CadMaquina$OuvinteSalvar.actionPerformed(CadMaquina.java:404)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Já tentei de tudo aqui para resolver e ainda não consegui… alguém pode me dar uma luz para resolver este problema??

Grato

Só por curiosidade, qual a finalidade do Statement.RETURN_GENERATED_KEYS? Quando eu compilei sem essa parte ele lançou uma SQLException porque obviamente eu não tenho essa tabela maquina.

Talvez o problema não seja esse mas se você está fazendo um cast, deve ser porque o import está errado, verifique se o import é: import java.sql.PreparedStatement; e não do mysql.

ele retorna um int com o id gerado pelo banco para o registro … ai eu consigo usar esse id para trabalhar com outros registros que dependem dele para serem salvos…

para constar … fiz uma impressão do sql que estou tentando inserir no banco :

stmt: com.mysql.jdbc.JDBC4PreparedStatement@11d20d3: INSERT INTO maquina(nro_serie, descricao, ativo, caracteristicas, id_grupo, id_subgrupo, id_fornecedor, modelo, id_marca, codigo, id_cliente, data_inclusao, id_usuario)VALUES(‘123’, ‘TESTE’, 1, ‘220v’, 2, 3, 14, ‘12’, 4, ‘6’, 1, ‘2013-04-16 00:00:00’, 1)

é esta sql que esta dando erro!!

opa,

meus imports para trabalhar com o banco são:

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

testei o sql direto no banco de dados e funcionou normalmente… não está funcionando no java …

retirei o cast da linha :

deixando ela da seguinte forma:

e o mesmo erro persiste…

alguma outra idéia??

desde já agradeço a ajuda!

De espaço antes de depois dos parênteses antes de escrever VALUES:

“) VALUES (”

A palavra chave não pode estar grudada no resto da expressão.

Tópico movido para o fórum de persistência

Olá!!

deixei com espaços na palavra VALUES da seguinte forma :

INSERT INTO maquina(nro_serie, descricao, ativo, caracteristicas, id_grupo, id_subgrupo, id_fornecedor, modelo, id_marca, codigo, id_cliente, data_inclusao, id_usuario) VALUES (‘123’, ‘TESTE3’, 1, ‘teste123’, 2, 3, 14, ‘123’, 4, ‘7’, 1, ‘2013-04-16 00:00:00’, 1)

e o erro continua!!

o estranho é que se eu pegar esta sql e executar ela no mysql administrator, a mesma é executada e insere os dados perfeitamente … porém se eu executar via programa … não funciona…

o que pode estar ocorrendo??

Grato

Se seu objeto m.getDataInclusao() for do tipo Date seta ele como date: stmt.setDate(12, m.getDataInclusao()); e veja no que dá

Isto está mal:

Deve ser simplesmente:

Com certeza o pmlm matou a charada. Com o parâmetro, irá submeter as ? como parte da query.

Opá…

pmlm está correto cara … retirei o sql do comando da linha:

ficando da segunte maneira:

e resolveu o problema !!!

Muito obrigado a todos que me ajudaram,
é muito bom para nós sabermos que podemos contar com a ajuda dos integrantes do GUJ.

Obrigado!