Ajuda com PreparedStatement

8 respostas
V
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controlbus.BD;

import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSet;
import controlbus.Bean.UsuarioBean;

/**
 *
 * @author Vagner Duarte
 */
public class InserirUsuario {
    PreparedStatement pstm;
    ResultSet rs;
    String gravarusuario = "INSERT INTO (LOGIN, SENHA, NIVEL_ACESSO) VALUES (?,?,?)";

       

    public void CadastrarUsuario(UsuarioBean usuario){
        try{
        ConectarMysql con = new ConectarMysql();
        pstm = con.Conectar().prepareStatement(gravarusuario);
        
        pstm.setString(1, usuario.getLogin());
        pstm.setString(2, usuario.getSenha());
         pstm.setInt(3,usuario.getAcesso());
         pstm = (PreparedStatement) con.Conectar().prepareStatement(gravarusuario);

        pstm.executeUpdate();
        // System.out.println(gravarusuario);
        // System.out.println(usuario.getAcesso());
        }

        catch(Exception e){
        e.printStackTrace();
        }


    }


}

Pessoal tenho a classe acima, mais esta acontecendo o seguinte erro:

incompatible types na seguinte linha:
pstm = con.Conectar().prepareStatement(gravarusuario);

Alguem pode me ajudar a resolver este erro???

8 Respostas

douglas_vidotto

O problema deve estar no seu método Conectar() que não deve estar retornando um objeto Connection.

Diego_Marinho
vagner.analista:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controlbus.BD;

import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSet;
import controlbus.Bean.UsuarioBean;

/**
 *
 * @author Vagner Duarte
 */
public class InserirUsuario {
    PreparedStatement pstm;
    ResultSet rs;
    String gravarusuario = "INSERT INTO (LOGIN, SENHA, NIVEL_ACESSO) VALUES (?,?,?)";

       

    public void CadastrarUsuario(UsuarioBean usuario){
        try{
        ConectarMysql con = new ConectarMysql();
        pstm = con.Conectar().prepareStatement(gravarusuario);
        
        pstm.setString(1, usuario.getLogin());
        pstm.setString(2, usuario.getSenha());
         pstm.setInt(3,usuario.getAcesso());
         pstm = (PreparedStatement) con.Conectar().prepareStatement(gravarusuario);

        pstm.executeUpdate();
        // System.out.println(gravarusuario);
        // System.out.println(usuario.getAcesso());
        }

        catch(Exception e){
        e.printStackTrace();
        }


    }


}

Pessoal tenho a classe acima, mais esta acontecendo o seguinte erro:

incompatible types na seguinte linha:
pstm = con.Conectar().prepareStatement(gravarusuario);

Alguem pode me ajudar a resolver este erro???

Vagner,

acho que se eu fosse vc eu trocava isso:

import com.mysql.jdbc.PreparedStatement;

por isso:

import java.sql.PreparedStatement;

Pois dessa maneira que você está fazendo, vc seria obrigado a fazer um (cast), assim no teu código:

pstm = (PreparedStatement) con.Conectar().prepareStatement(gravarusuario);

ou

java.mysql.PreparedStatement pstm = con.Conectar().prepareStatement(gravarusuario);

Só que acho muito feio se vc pode já de cara e com poucas linhas pode minimizar todo esse código.

O negócio é não complicar, java foi feito pra não complicar.

E é só isso, qualquer coisa, grita ou posta!!! rsrsrs

[]'s.

V

Diego Marinho o problema era esse mesmo, troquei como vc disse e deu certo, mas agora tem outro problema, o pstm não esta setando os valores nas ?, então quando eu mando imprimir como esta ficando o final fica assim:

INSERT INTO (LOGIN, SENHA, NIVEL_ACESSO) VALUES ?,?,?

Alguém sabe porque não esta substituindo os ? pelos valores que tem que ser setados???

Diego_Marinho

vagner.analista:
Diego Marinho o problema era esse mesmo, troquei como vc disse e deu certo, mas agora tem outro problema, o pstm não esta setando os valores nas ?, então quando eu mando imprimir como esta ficando o final fica assim:

INSERT INTO (LOGIN, SENHA, NIVEL_ACESSO) VALUES ?,?,?

Alguém sabe porque não esta substituindo os ? pelos valores que tem que ser setados???

Vagner,

você já pensou em colocar o nome da tabela depois do “INSERT INTO [table_name] (LOGIN,…”.
acho que assim o programa vai fazer a associação necessária.

Se não for isso, verifique o erro que causa ao final do procedimento da instrução.

Só prestar um pouco mais de atenção Vagner!

[]'s.

a.moraissoares

vagner.analista

a substituição das ? pelos valores é feito internamente, ou seja, mesmo vc dando um System.out.println na sua query,ela não mostrará os valores substituidos.
O que importa é se está funcionando.

Ainda está acusando algum erro? Se sim: Qual? Onde?

a.moraissoares

Opa.

Acabei de ver seu erro.

Primeiro você faz a conexão e seta os valores usando esse código aqui:

pstm = con.Conectar().prepareStatement(gravarusuario); pstm.setString(1, usuario.getLogin()); pstm.setString(2, usuario.getSenha()); pstm.setInt(3,usuario.getAcesso());

e logo após, antes de você executar o Update, você está refazendo a conexão, ou seja, zerando os valores que ali estavam já setados:

pstm = (PreparedStatement) con.Conectar().prepareStatement(gravarusuario); pstm.executeUpdate();
Daí quando ele vai fazer o update, não existem valores setados no preparedStatement(gravarusuario)

Espero que resolva seu problema. Abraço

V
public void CadastrarUsuario(UsuarioBean usuario){
        try{
        ConectarMysql con = new ConectarMysql();
        String gravarusuario = "INSERT INTO TB_LOGIN(LOGIN, SENHA, NIVEL_ACESSO) VALUES (?,?,?)";
        //String gravarusuario = "INSERT INTO tb_login (login, senha, nivel_acesso)VALUES("+usuario.getLogin()+","+usuario.getSenha()+
         //       ","+usuario.getAcesso()+")";

        pstm = con.Conectar().prepareStatement(gravarusuario);

       pstm.setString(1, usuario.getLogin());
        pstm.setString(2, usuario.getSenha());
       pstm.setInt(3,usuario.getAcesso());
        pstm.executeQuery();
        
        }

a.moraissoares desculpe se estou dando trabalho, mas a minha classe acima esta fazendo tudo certo, pelo menos ao meu ver e não consigo ver onde esta o erro, quando eu executo veja a Exception que esta dando:

run:
java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
        at com.mysql.jdbc.Statement.checkForDml(Statement.java:417)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1383)
        at controlbus.BD.InserirUsuario.CadastrarUsuario(InserirUsuario.java:34)
        at controlbus.Funcoes.Usuario.PegarDadosUsuario(Usuario.java:266)
        at controlbus.Funcoes.Usuario.bt_gravarActionPerformed(Usuario.java:235)
        at controlbus.Funcoes.Usuario.access$200(Usuario.java:22)
        at controlbus.Funcoes.Usuario$3.actionPerformed(Usuario.java:107)
        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:6216)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5981)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4583)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4413)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2475)
        at java.awt.Component.dispatchEvent(Component.java:4413)
        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)
CONSTRUÍDO COM SUCESSO (tempo total: 10 segundos)
tiagobernardo32

Vagner.analista,

substitua o

pstm.executeQuery();

por:

pstm.executeUpdate();

e veja se funciona.

Ate +

Criado 20 de setembro de 2009
Ultima resposta 21 de set. de 2009
Respostas 8
Participantes 5