Update - problema com preparedStatement[CONCLUÍDO]

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:

[code]
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();
    }
}[/code]

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)

tenta tirar as aspas simples… pode ser que funcione!

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

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();
        }

os problemas sao as aspas simples mesmo

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?

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

Fica sem as aspas dos ‘?’ :wink:

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 =)

Vlw a força gurizada! XD