Problema execução Update Mysql java [RESOLVIDO]

6 respostas
M

Pessoal, bom dia.

Tenho uma rotina de atualização de estoque via código que executa essa frase SQL:

UPDATE produto_estoque SET estoque_atual = estoque_atual - 2 WHERE codigo = 1

Problema começa quando a rotina funciona só quando está em modo Debug. Em operação normal, não funciona de jeito algum.

Tem alguma lógica isso, pois a rotina contrária, que incrementa no estoque, funciona perfeitamente.

Segue o método, e os parâmetros são:

  • String campo: nome do campo que vai ser incrementado na tabela produto_estoque
  • double incrementoValor: qtde que será incrementada
  • int codigoProdutoEstoque: código (chave) dessa tabela produto_estoque
public void somarSaldoEstoque(String campo, double incrementoValor, int codigoProdutoEstoque) throws SQLException {
        try {
            StringBuilder sb = new StringBuilder();
            sb.append("UPDATE produto_estoque SET ");
            sb.append(campo);
            sb.append(" = ");
            sb.append(campo);
            sb.append("+");
            sb.append(incrementoValor);
            sb.append(" WHERE codigo = ");
            sb.append(codigoProdutoEstoque);

            conexao = ConexaoMysql.recuperarConexao();
            ps = conexao.prepareStatement(sb.toString());
            ps.executeUpdate();

        } finally {
            ConexaoMysql.fecharConexao(conexao, ps);
        }
    }

Se alguém puder me dar uma luz nisso. Ou sugerir um jeito mais elegante de incrementar/decrementar no estoque, agradeço.
Obrigado.

6 Respostas

darklordkamui

quando vc da um sysout no sb o que aparece para vc?

uma dica faça de modo elegante… do jeito que vc faz pode gerar sql inject…

exemplo de uma boa para vc fazer…

PreparedStatement stmt = con.prepareStatement("SELECT * FROM `preco` WHERE `poster` = ?"); stmt.setString(1, poster); ResultSet rs = stmt.executeQuery();

T

Cara, com certeza é erro de query e você tem o erro no seu console.
A dica do darklordkamui irá te ajudar pois para criar uma query não é necessário um StringBuilder, no máximo use uma variável String.
Para te auxíliar mais ainda, escreva o comando.

System.out.println(Query)

Apenas para verificar se sua query está certa.

Estamos por ai qualquer coisa…

M

Pessoal, muito obrigado pelo empenho nas respostas.
Consegui resolver o problema, era mesmo um erro na Frase Sql.

O usuário Tiago Bevilaqua disse que:

“para criar uma query não é necessário um StringBuilder”

Eu acho bem interessante o uso da StringBuilder pois estou concatenando Strings. E fazer na não com uso do operador + não fica bom.
Mas há maneiras super legais e legíveis de se melhorar isso.

Agradeço pelas respostas, muito obrigado.

pmlm

Sabes o porque de estares a afirmar isto? Ou simplesmente leste em algum lado?

Para este caso concreto ter isto

StringBuilder sb = new StringBuilder();  
sb.append("UPDATE produto_estoque SET ");  
sb.append(campo);  
sb.append(" = ");  
sb.append(campo);  
sb.append("+");  
sb.append(incrementoValor);  
sb.append(" WHERE codigo = ");  
sb.append(codigoProdutoEstoque);  

String s = sb.toString();

ou ter isto

String s "UPDATE produto_estoque SET " + campo + " = " + campo + "+" + incrementoValor + " WHERE codigo = " + codigoProdutoEstoque;

é exactamente igual.

darklordkamui

Isso é má praticas… não escreva codigos sql assim… faça igual eu postei a cima…
se nao vc vai criar vulnerabilidades no sistema atoa… fica dica… não seja mais um que faz codigos assim…

pmlm

darklordkamui:
Isso é má praticas… não escreva codigos sql assim… faça igual eu postei a cima…
se nao vc vai criar vulnerabilidades no sistema atoa… fica dica… não seja mais um que faz codigos assim…

Não estou sequer a falar de usar Statement ou PreparedStatement. A minha observação era somente sobre String vs StringBuilder.

E mesmo em relação ao uso do PreparedStatement, para o que é necessário aqui, teria de haver concatenação de String uma vez que o campo é dinâmico. Isto não traz problemas de SQLInjection se o seu acesso for feito unicamente dentro do código e sem valores que venham do utilizador.

Criado 11 de dezembro de 2012
Ultima resposta 11 de dez. de 2012
Respostas 6
Participantes 4