Update - problema com preparedStatement[CONCLUÍDO]

9 respostas
guisantogui

galera to passando a seguinte query pro meu metodo:

public final String UPDATE = "UPDATE Cliente SET nome='?', endereco='?', telefone='?', data_nasc='?' WHERE idCliente='?';";
e o meu metodo:
public void update(String nome, String endereco, String telefone, String data, int id){
        Connection connection = new ConnectionFactory().getConnection();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        try {
            java.util.Date d = sdf.parse(data);
            PreparedStatement prepStm = connection.prepareStatement(UPDATE);
            prepStm.setString(1, nome);  // AQUI <<<<
            prepStm.setString(2, endereco);
            prepStm.setString(3, telefone);
            prepStm.setDate(4, new Date(d.getTime()));
            prepStm.setInt(5, id);

            prepStm.execute();
        }
        catch(SQLException sqle){
            sqle.printStackTrace();
        }
        catch(ParseException pe){
            pe.printStackTrace();
        }
    }
E ele retorna a seguinte exceção dizendo que o meu parametro um (linha destacada) está fora do "bounds" mas os "?" não deveriam ser as indexes ?? Segue exceção:
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
        at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3288)
        at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3272)
        at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4108)

9 Respostas

laercioferracini

tenta tirar as aspas simples… pode ser que funcione!

guisantogui

Mas a query não precisa das aspas, vai quebrar o sql daí, certo!??

laercioferracini

nas minhas classes DAO eu sempre fiz sem as aspas simples,
no meu caso eu uso SQL Server, pode ser que mude… mas tenta ai!

String sql = "UPDATE equipamento SET nm_equipamento =?, "
                        + "num_patrimonio =?, cod_tipo_equip =?,"
                        + "modelo_equip =?"
                        + " WHERE cod_equipamento =?";
        try{
            PreparedStatement stm = con.prepareStatement(sql);

            stm.setString(1, equip.getNomeEquip());
            stm.setString(2, equip.getPatrimonio());
            stm.setInt(3, equip.getTipoId());
            stm.setString(4, equip.getModelo());
            stm.setInt(5, equip.getId());

            stm.execute();
            stm.close();

            JOptionPane.showMessageDialog(null, "Equipamento alterado com sucesso");
        }catch(SQLException ex){
            
            throw new RuntimeException();
        }
rafaelviny

os problemas sao as aspas simples mesmo

guisantogui

Bom sendo que o problema são as aspas, eu deveria colocar as aspas nos valores que eu passar ou deixar sem aspas nenhuma mesmo?

jamirdeajr

Não precisa colocar aspas simples nos valores, ele se adapta de acordo com o tipo e vai incluir se necessário.

jrbilll

Fica sem as aspas dos ‘?’ :wink:

mapleplayer

No seu comando sql do tipo String você não coloca aspas simples em torno do valor do campo o qual você não sabe ainda qual valor será. Mesmo que você saiba o valor, não coloque ele diretamente.
Ao invés do valor no campo, você insere o sinal de interrogação, de novo, sem as aspas simples ao redor.

Seu comando em String fica assim

"update table set campo = ?"

Depois com o PreparedStatement você pode determinar um valor para aquele campo com um de seus métodos
setXxx(índice_do_campo, valor).
Exemplo:

setString(1,"valor");
//Vai substituir o primeiro sinal de interrogação do seu comando pelo valor fornecido, o qual é a String "valor"

espero ter ajudado =)

guisantogui

Vlw a força gurizada! XD

Criado 22 de março de 2011
Ultima resposta 23 de mar. de 2011
Respostas 9
Participantes 6