Dúvida

30/09/2009

Professor ache que havia resolvido a qustão mais esta engando crie a classe de teste e tive o seguinte problema ! O que pode esta acontecendo?

No value specified for parameter 4
java.sql.SQLException: No value specified for parameter 4
        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.fillSendPacket(PreparedStatement.java:2214)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2020)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949)
        at devmedia.dao.ProdutoDao.set(ProdutoDao.java:46)
        at devmedia.dao.ProdutoDaoTest.testSet(ProdutoDaoTest.java:73)
Ruinaldo

Ruinaldo

Curtidas 0

Respostas

Henrique Weissmann

Henrique Weissmann

30/09/2009

Olá Ruinaldo,

duas possíveis causas para o seu problema (mais provável):
* você criou um PreparedStatement que possui n parametros, porém não preencheu um deles (o de ordem 4).

* sua instrução SQL para inclusão de registros ou edição está errada, tal como no exemplo abaixo:
"insert into tabela (campoA, campoB, campoC) values (?, ?)" (falta um parametro)
GOSTEI 0
Ruinaldo

Ruinaldo

30/09/2009

Professor estou enviando minha classe que estou trabalhnado gostaria que o senhor desse uma olhada nela por gentileza pois precxiso descobrir o quanto antes esse problema
public class ProdutoDao extends DatabaseUtil {

    private static final long serialVersionUID = 1L;
    public ProdutoDao(){
        super();
    }

    public boolean add(Produto prod)throws ClassNotFoundException, SQLException {
        PreparedStatement ps =   getPreparedStatement("INSERT INTO aplicacaojsf.produto values (?,?,?,?)");
        ps.setInt(1, prod.getId());
        ps.setString(2, prod.getNome());
        ps.setInt(3, prod.getNumeroDeItens());
        ps.setDouble(4, prod.getPreco());
        int toReturn = ps.executeUpdate();
         ps.close();
         return toReturn > 0 ;
    }
    public boolean set(Produto prod)throws ClassNotFoundException, SQLException{
        PreparedStatement ps = getPreparedStatement("update aplicacaojsf.produto set nome=?, numeroDeItens=?, price=? where id=?");
         ps.setString(1,prod.getNome());
         ps.setInt(2, prod.getNumeroDeItens());
         ps.setDouble(3, prod.getPreco());
        int toReturn = ps.executeUpdate();
         ps.close();
         return toReturn > 0 ;
    }

    public boolean delete (Produto prod)throws ClassNotFoundException, SQLException{
          PreparedStatement ps = getPreparedStatement("DELETE from aplicacaojsf.produto where id=?");
            ps.setInt(1, prod.getId());
            int toReturn = ps.executeUpdate();
         ps.close();
         return toReturn > 0 ;
        }
    public List<Produto> getAllProduto()throws ClassNotFoundException, SQLException{
        List<Produto> toReturn = new LinkedList<Produto>();
        ResultSet rs = getStatement().executeQuery("Select * from aplicacaojsf.produto");
            while (rs.next()){
                Produto prod = new Produto();
                populateProd(prod, rs);
                toReturn.add(prod);
            }
        rs.close();
        return toReturn;
    }

    private void populateProd (Produto prod, ResultSet rs) throws SQLException{
        prod.setId(rs.getInt("id"));
        prod.setNome(rs.getString("nome"));
        prod.setNumeroDeItens(rs.getInt("numeroDeItens"));
        prod.setPreco(rs.getDouble("price"));

    }
    public Produto getById(int idProduto)throws ClassNotFoundException, SQLException{
        PreparedStatement ps = getPreparedStatement ("select * from aplicacaojsf.produto where id=?");
        ps.setInt(1, idProduto);
        ResultSet rs = ps.executeQuery();
        if (!rs.next())return null;
        Produto toReturn = new Produto();
        populateProd (toReturn, rs);
        rs.close();
        ps.close();
        return toReturn;
    }



}

GOSTEI 0
Henrique Weissmann

Henrique Weissmann

30/09/2009

Há um problema nesta função:

public boolean set(Produto prod)throws ClassNotFoundException, SQLException{
        PreparedStatement ps = getPreparedStatement("update aplicacaojsf.produto set nome=?, numeroDeItens=?, price=? where id=?");
         ps.setString(1,prod.getNome());
         ps.setInt(2, prod.getNumeroDeItens());
         ps.setDouble(3, prod.getPreco());
        int toReturn = ps.executeUpdate();
         ps.close();
         return toReturn > 0 ;
    }

repare, você está definindo apenas 3 dos 4 parametros do seu comando SQL no PreparedStatement.
GOSTEI 0
Ruinaldo

Ruinaldo

30/09/2009

Valeu professor muito bem esclarecido obrigado pela atenção já pode encerra o chamado!
abraços
GOSTEI 0
Ruinaldo

Ruinaldo

30/09/2009

Só mais uma coisa sempre que eu tiver problemas de Paramentro com preparede Statemente na maioria dos caso esta relacionado um desse caso que me apontou? 
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

30/09/2009

na realidade, 90% dos casos que eu vejo de problemas com PreparedStatements são decorrentes mais da instrução SQL em cima da qual ele é construido.

Porém, estes erros como o que você cometeu também são comuns.
GOSTEI 0
POSTAR