[RESOLVIDO]Problema ao inserir registro com preparedstatement

12 respostas
A

Bom dia pessoal,

estou com o seguinte problema... tenho o codigo :
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();
        }
        
    }

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

12 Respostas

S

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.

Fexx

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.

A

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!!

A

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;
A

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!

ViniGodoy

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.

ViniGodoy

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

A

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

Fexx

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

pmlm

Isto está mal:

Deve ser simplesmente:

ViniGodoy

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

A

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!

Criado 16 de abril de 2013
Ultima resposta 16 de abr. de 2013
Respostas 12
Participantes 5