[Statement] executeUpdate()

Pessoal, gostaria de saber se alguém pode me ajudar!

Estou com um sistema sendo desenvolvido em J2SE, estou utilizando o netbeans como editor.
Dividi da seguinte forma:

Classe para conexao no pacote DAO ( Conexao)
Classe para tratamento no pacote DAO (CadastroDAO)
Classe com a tela de cadastro no pacote PRINCIPAL (frmCadastro)

na minha classe Conexao está toda a minha rotina para abrir conexao, Resultset, Statement, tudo certinho!

Para fazer inclusao, exclusão e consulta, esta tudo funcionando perfeitamente, estou com problema no update.

vejam (apenas os trechos importantes)

frmCadastro()


int idConta = Integer.parseInt(txtidConta.getText());
String conta= txtNome.getText();
Float valor = Float.parseFloat(txtValor.getText().replace(",","."));

//para executar o update

DAO.CadastroDAO cadDAO = new DAO.CadastroDAO();

cadDAO.AlteraConta(idConta, conta, valor);

CadastroDAO(){


public void AlteraConta(int IdConta, String conta, float valor){
    DAO.Conexao con = new DAO.Conexao();
    String sql = "UPDATE conta SET ctn_valor = "+valor+" WHERE cnt_id = "+idConta+";";
    try{
        if(con.st.executeUpdate(sql)>0){
          System.out.println("Registro alterado com sucesso");
        } else {
          System.out.println("ERRO ao registrar o registro");
        }       
    }catch(SQLException e){
       System.err.println(e);
    }
}

O problema é:

todos os dados que são passados por parâmetros são preenchidos de acordo com o seu tipo, mas quando eu mando executar ele não executa o executeUpdate(sql), e cai direto no “else”

outras classes estão montadas da mesma forma utilizando o executeUpdate() dentro da condição if, e estão funcionando perfeitamente, porém para esa em especial, não funciona!

Se alguém puder me ajudar, agradeço!..abraços

Só para matar a dúvida, tenta colocar o código assim:

 String sql = "UPDATE conta SET ctn_valor = ' "+valor+" '  WHERE cnt_id = ' "+idConta+" ' ";  

Por que sempre usei aspas simples e depois duplas…
Não sei se funcionam sem…

eu ja havia tentado colocar “aspas simples”, na vdd ele deica o IdConta e o valor como string na concatenação, mas na vdd tem q ser passar como int e float para o banco mesmo!

há 2 dias estou ollhando esse código, já refiz várias vezes, compilando, depurando, etc…

simplesmente não roda.

Se eu coloco

if(con.st.executeUpdate(sql) == 1)

ele entra no if e mostra como cadastrado, mas na tabela não faz alteração alguma!

só que a condição

if(con.st.executeUpdate(sql) > 0)

eu aprendi em um tutorial e aplique a todos os outros métodos do restante do sistema, e estão funcionando pefeitamente, porém em um único método que está recebendo esses parametros, como descrito, não funciona!

OBS: apresentação do sistema é hj!..kkkk

Seu código será bem mais legível e menos propicio a erros se você usar preparedStatement.

Baixe a apostila FJ21 da Caelum que é de graça e que no tópico de JDBC ensina sobre preparedStatement.

Kaesar, obrigado pela sua dica.

Na verdade o meu con.st refere-se à minha classe Conexao na camada DAO ou seja, na minha classe Conexao eu tenho:

PreparedStatement st = …

por isso que eu faço a “chamada” com “con.rs”

Mas mesmo assim eu vou ler a apostila e vou tentar reavaliar o meu código.

Eu estou trabalhando em camadas no conceito de NTier ou MVC, como muitos dizem.

PACOTE DAO: todas as querys e conexao com banco de dados
PACOTE BO: todas as regras de negocios que envolvem o sistema, tratamento de exceções, validação de campos, chamadas de métodos, etc.
PACOTE PRINCIPAL: todos os frames que tem interação com usuário. não há regras de negócio nessa camada!.

Com esse conceito eu consigo deixar o código mais legível e de fácil manutenção.

Acho estranho apenas em uma unica consulta (que citei acima) não estar funcionando, sendo que todas as outras classes que tenho (ContasDAO, FuncionariosDAO, ComprasDAO…) usarem o mesmo padrão(também citado acima).

isso tá um mistério!..
mostrei o meu código para um amigo que é OCJP e ele disse que o código está correto, que não consegue entender o pq está acontecendo isso!..mas bem!..veremos o que se resolve…hehehe…creio que mais uma tentativa poderá resolver (tentativa = apagar as classes envolvidas e fazer novamente)…rs.

valeu

Eu faria desse geito:

String sql = "UPDATE conta set valorConta = ? WHERE  contaId= ?" 

preparedStatement stmt = connection.prepareStatement(sql); 
stmt.SetString(1, valor);
stmt.setString(2, id); 

Esse código pode muito bem ser encapsulado dentro de um método em um DAO.

Entendi!..eu tentarei…
mas me diga, e o uso do


if(stmt.executeUpdate(sql) > 0){}

pois na depuração, ele barra justamente nessa parte!..pode ser problema com a String sql?

Obrigado pela ajuda! =D~

Provavelmente, bancos de dados são extremamente ‘chatos’ quando se trata de aspas duplas e aspas simples. pesquise sobre SQL Injection e ‘preconceito contra Joana D’Arc’

Cara, eu usaria um ResultSet para resolver de vez seu problema.

    public void AlteraConta(int IdConta, String conta, float valor){  

             String sql = "UPDATE conta SET ctn_valor = "+valor+" WHERE cnt_id = "+idConta;   
             rs = st.executeUpdate(sql);
             if(rs.next()){  
               System.out.println("Registro alterado com sucesso");  
             } else {  
               System.out.println("ERRO ao registrar o registro");  
             }         
    }  

Acho bem mais tranquilo trabalhar com ResultSet.
Desculpe a pergunta, mas não vi você utilizando em lugar nenhum o parâmetro (String conta) no seu método, então para que tê-lo?
Abraços.

Tiago Bevilaqua

Inesplicavelmente eu não sei qual foi a mágica!..mas funcionou perfeitamente da maneira que você me indicou!

Gostaria de entender as diferenças de um modelo de código para outro, mas enfim!..o importante é que está funcionando…hehehe…

Abraços!..obrigado a todos!