Atualizar um valor

4 respostas Resolvido
java
jairodione

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!

4 Respostas

L

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()
...
jairodione

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.

L
Solucao aceita

É 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…

jairodione

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!

Criado 14 de março de 2017
Ultima resposta 15 de mar. de 2017
Respostas 4
Participantes 2