Atualizar um valor

Gostaria de alterar somente o valor de um único atributo do BD (saldo), na verdade gostaria de colocar o valor(0.00) neste atributo. Fiz um método mais não estou conseguindo atualizar o valor do atributo saldo no BD. Abaixo está descrito o método:

//metodo para zerar saldo de contas de receita e despesa
public void zeraSaldo() throws SQLException {
    String sql = "update contas set consaldo=0.00 where tipocodigo=1";
    PreparedStatement ps = null;
    Contas contas = new Contas();
    try {
        ps = connection.prepareStatement(sql);
        ps.setString(1, contas.getConDescricao());
        ps.setInt(2, contas.getTipoCodigo());
        ps.setDouble(3, contas.getConSaldo());/*GOSTARIA DE ATUALIZAR OU SEJA DE COLOCAR O VALOR O.OO NESTE ATRIBUTO, QUERO DIZER NESTE OBJETO, MAS ATUALIZAR ESTE VALOR NO BD.*/
        ps.setInt(4, contas.getConCodigo());
        ps.execute();
    } catch (SQLException ex) {
        Logger.getLogger(ContaDAO.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        connection.close();
        ps.close();
    }

    /*String sql = "select * from contas where tipocodigo = 1 order by condescricao";

    PreparedStatement ps = null;
    ResultSet rs = null;
    List<Contas> listaContas = new ArrayList<Contas>();

    try {
        ps = connection.prepareStatement(sql);
        rs = ps.executeQuery();
        while (rs.next()) {
            Contas contas = new Contas();
            contas.setConCodigo(rs.getInt("concodigo"));
            contas.setConDescricao(rs.getString("condescricao"));
            contas.setTipoCodigo(rs.getInt("tipocodigo"));
            contas.setConSaldo(rs.getDouble("consaldo"));
            listaContas.add(contas);
            //System.out.println("Conta: " + contas.getConDescricao() +"  ---> Saldo: "+contas.getConSaldo());
            if(contas.getConSaldo() < 0){
                System.out.println("Conta: " + contas.getConDescricao() +"  ---> Saldo: "+contas.getConSaldo());
                contas.setConSaldo(rs.getDouble(0.00));
                System.out.println("Saldo apos zerar Conta: " + contas.getConDescricao() +"  ---> Saldo: "+contas.getConSaldo());
            }
        }
    } catch (SQLException erro) {
        Logger.getLogger(ContaDAO.class.getName()).log(Level.SEVERE, null, erro);
    } finally {
        //connection.close();
        //ps.close();
        //rs.close();
    }*/

}

O console do NetBeans mostra o seguinte erro:

Mar 14, 2017 7:48:11 PM br.com.jairo.dao.ContaDAO zeraSaldo
SEVERE: null
org.postgresql.util.PSQLException: O índice da coluna está fora do intervalo: 1, número de colunas: 0.
at org.postgresql.core.v3.SimpleParameterList.bind(SimpleParameterList.java:52)
at org.postgresql.core.v3.SimpleParameterList.setNull(SimpleParameterList.java:129)
at org.postgresql.jdbc2.AbstractJdbc2Statement.setString(AbstractJdbc2Statement.java:1241)
at org.postgresql.jdbc2.AbstractJdbc2Statement.setString(AbstractJdbc2Statement.java:1230)
at br.com.jairo.dao.ContaDAO.zeraSaldo(ContaDAO.java:335)
at br.com.jairo.controle.Fechamento.processRequest(Fechamento.java:43)
at br.com.jairo.controle.Fechamento.doGet(Fechamento.java:61)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
at java.lang.Thread.run(Thread.java:722)

Alguem pode me mostrar onde estou errando!

Você está passando os parâmetros para sua query…

...
ps.setString(1, contas.getConDescricao());
ps.setInt(2, contas.getTipoCodigo());
ps.setDouble(3, contas.getConSaldo());
ps.setInt(4, contas.getConCodigo());
...

Mas no seu update você não está marcando-os com ?

String sql = "update contas set consaldo = ? where tipocodigo = ?";

...
ps.setDouble(1, 0.0);
ps.setInt(2, contas.getTipoCodigo());
ps.executeUpdate(); //evite ps.execute()
...

Olá LostSoldier!

Não utilizei parâmetros porque o usuário ira clicar na opção fechamento que por sua vez chama o servlet e por sua vez chama o método acima na classe ContaDAO.

É justamente onde estou apontando o erro, já que você não quer passar os parâmetros para query, deixando tudo “travado” como a gente diz, você não pode passar os parâmetros setString, etc… pegou?

String sql = "update contas set consaldo=0.00 where tipocodigo=1";
PreparedStatement ps = null;
Contas contas = new Contas();
try {
    ps = connection.prepareStatement(sql);
    ps.executeUpdate();
} catch (SQLException ex) {
    Logger.getLogger(ContaDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
    connection.close();
    ps.close();
}

Ou…

String sql = "update contas set consaldo = ? where tipocodigo = ?";
PreparedStatement ps = null;
Contas contas = new Contas();
try {
    ps = connection.prepareStatement(sql);
    ps.setDouble(1, 0.0);
    ps.setInt(2, contas.getTipoCodigo());
    ps.executeUpdate();
} catch (SQLException ex) {
    Logger.getLogger(ContaDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
    connection.close();
    ps.close();
}

Além do mais a quantidade que você passa para o objeto ps é maior do que sua query suportaria…

Olá LostSoldier!

Fico bastante agradecido pela sua ajuda, sem ela não conseguiria resolver este problema. Fiz seu 1º exemplo e resolveu, ficou exatamente como queria.

String sql = “update contas set consaldo=0.00 where tipocodigo=1”;
PreparedStatement ps = null;
Contas contas = new Contas();
try {
ps = connection.prepareStatement(sql);
ps.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(ContaDAO.class.getName()).log(Level.SEVERE, null, ex);
} finally {
connection.close();
ps.close();
}

Muito Obrigado!

1 curtida