[RESOLVIDO] Campo salário dando erro no MySQL

8 respostas
B

Gente boa, cheguei agora aqui no Forum e esse é o meu 1º tópico!
Preciso da ajuda de vocês…

Estou com uma aplicação dando problema quando tento salvar os valores no banco.
Quando abro a tela, os campos já vem preenchidos com o primeiro registro da tabela,
porém só de tentar salvar sem alterar nada já está dando o erro!
Vejam o código:

private void Salvar_Update() {
        String editarFun = null;
        int vcargo = 0, vsetor = 0;
        vcargo = cbCargo.getSelectedIndex();
        vsetor = cbSetor.getSelectedIndex();
        try {
            int cod_fun = 0;
            cod_fun = Tfun.rs.getInt("FUN_COD");
            editarFun = "UPDATE FUNCIONARIOS SET FUN_NOME ='" + txNome.getText() + "',FUN_CPF='"
                    + txCPF.getText() + "', FUN_RG='" + txRG.getText() + "', FUN_CEP='"
                    + txCEP.getText() + "', FUN_NUMERO='" + txNumero.getText() + "', FUN_COMPLE='"
                    + txComple.getText() + "', FUN_TEL='" + txTele.getText() + "', FUN_CARGO='"
                    + vcargo + "', FUN_SETOR='" + vsetor + "', FUN_SALARIO='" + txSalario
                    + "', FUN_SEXO='" + sexo + "'"
                    + " WHERE FUN_COD=" + cod_fun + ";";
            Tfun.st.executeUpdate(editarFun);
            JOptionPane.showMessageDialog(null, "Cliente alterado com Sucesso!!!");
            Tfun.exeSQL("SELECT * FROM CLIENTE");
        } catch (SQLException erro) {
            JOptionPane.showMessageDialog(null, "Erro ao Salvar!" + "\n" + erro + "\n" + editarFun);
        }
    }

O campo salário lá no banco é DOUBLE.
Quando tento salvar, o erro apresentado é o seguinte:

Deu pra entender, galera? Alguém pode me ajudar?
Valeu!

Sistemas utilizados: NetBeans 6.9.1, MySQL 5.1.35

8 Respostas

S

Da um System.out.println no txSalario.

Tente remover a aspa simples em FUN_SALARIO=’" + txSalario + "’

Outra coisa, use PreparedStatement ao inves de Statement.

Roger75

Talvez você esteja tentando colocar um valor além da capacidade do campo. Veja quantas casas decimais está passando.

Fabiano_Abreu

Olá brunokchimbo,

Complementando as dicas dos colegas, sugiro a adoção do tipo decimal, ao invés de double, pois, double não tem precisão, já decimal tem.

Veja este post: http://paposql.blogspot.com.br/2011/10/como-armazenar-informacoes-do-tipo.html

Abraços.

_ _
Fabiano Abreu
Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL

Gleidson_Henrique

Sei que voce está começando, mas estuda sobre PreparedStatement, irá lhe ajudar muito.

Abaixo segue uma classe que uso como padrao. Tente implementa-la futuramente:

package Utilitarios;

import java.sql.Connection;
import java.sql.SQLException;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.Annotations;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.DriverManager;
import java.text.SimpleDateFormat;
import java.sql.Date;
import java.sql.Types;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class Conexao{
    
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static String DATABASE_URL = "";
    Connection connection = null; // gerencia a conexão
    PreparedStatement pstmt = null;
    public ResultSet resultset;
    
    
    public void conectar(){
	
        try {
            DATABASE_URL = "jdbc:mysql://localhost/bancodedados";

            Class.forName(JDBC_DRIVER);

            // estabelece conexão com o banco de dados
            connection = DriverManager.getConnection( DATABASE_URL, "root", "minhasenhaaqui" );
            
        } catch (ClassNotFoundException ex) { 
            ex.printStackTrace();
        } catch (SQLException ex) { 
            ex.printStackTrace();
        }
    }
    
    public void desconectar(){
        try                                                        
         {                                                          
            //statement.close();                                      
            connection.close();                                     
         }
         catch ( NullPointerException exception )                              
         {                                                          
            exception.printStackTrace();
         }
        catch ( Exception exception )                              
         {                                                          
            exception.printStackTrace();
         }
    }
    
    public void update(String sql, Object dados[]){
        try {
            // cria Statement para consultar banco de dados
            pstmt = connection.prepareStatement(sql);
            
            for(int i = 0; i < dados.length; i++){
                if(dados[i] instanceof Integer){
                    pstmt.setInt(i+1, Integer.parseInt(String.valueOf(dados[i])));
                } else if(dados[i] instanceof String)
                {
                    pstmt.setString(i+1, (String) dados[i]);
                } else if(dados[i] instanceof Date){
                    pstmt.setDate(i+1, (java.sql.Date)dados[i]);
                } else if(dados[i] instanceof Float){
                    pstmt.setFloat(i+1, Float.parseFloat(String.valueOf(dados[i])));
                } else if(dados[i] == null){
                    pstmt.setNull(i+1, Types.DATE);
                }
            }
            
            //pstmt.setString(1, "Teste");
            pstmt.executeUpdate();
            
            
        } catch (SQLException ex) {  
            ex.printStackTrace();
        }
    }
    
    public void select(String sql){
        try {
            // cria Statement para consultar banco de dados
            
            pstmt = connection.prepareStatement(sql);
            resultset = pstmt.executeQuery();
        } catch (com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException ex){
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        
    }
    
    public byte insert(String sql, Object dados[]){
        try {
            // cria Statement para consultar banco de dados
            pstmt = connection.prepareStatement(sql);
            
            for(int i = 0; i < dados.length; i++){
                if(dados[i] instanceof Integer){
                    pstmt.setInt(i+1, Integer.parseInt(String.valueOf(dados[i])));
                } else if(dados[i] instanceof String)
                {
                    pstmt.setString(i+1, (String) dados[i]);
                } else if(dados[i] instanceof Date){
                    pstmt.setDate(i+1, (java.sql.Date)dados[i]);
                } else if(dados[i] instanceof Float){
                    pstmt.setFloat(i+1, Float.parseFloat(String.valueOf(dados[i])));
                } else if(dados[i] == null){
                    pstmt.setNull(i+1, Types.DATE);
                }
            }
            pstmt.executeUpdate();
            return 1;
        } catch (MySQLIntegrityConstraintViolationException ex) {  
            //Nesse caso, o item ja existe
            return 2;
        } catch (SQLException e){
            JOptionPane.showMessageDialog(null, "Algum erro inesperado ocorreu!");
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, e);
            return 3;
        }
    }
    
    public void delete(String sql){
        try {
            pstmt = connection.prepareStatement(sql);
            int deletados = pstmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Dei uma mexida nele para postar aqui visto que eu puxava algumas informações de um arquivo XML.. se algo nao funcionar, provavelmente é isso.. dai voce diz ai que eu arrumo pra voce...

Abraços

marcospaulo.suporte

O campo txSalario é um campo texto? nao faltou ou .getText() ?

editarFun = "UPDATE FUNCIONARIOS SET FUN_NOME ='" + txNome.getText() + "',FUN_CPF='" + txCPF.getText() + "', FUN_RG='" + txRG.getText() + "', FUN_CEP='" + txCEP.getText() + "', FUN_NUMERO='" + txNumero.getText() + "', FUN_COMPLE='" + txComple.getText() + "', FUN_TEL='" + txTele.getText() + "', FUN_CARGO='" + vcargo + "', FUN_SETOR='" + vsetor + "', FUN_SALARIO='" + txSalario.getText() + "', FUN_SEXO='" + sexo + "'" + " WHERE FUN_COD=" + cod_fun + ";";

B

Valeu mesmo, galera! Principalmente ao Gleidson Henrique que teve o trabalho
de postar toda a sua classe aê no forum.

Bom, depois de ler a ultima resposta…

…fiz um pouco diferente do que me disse o Sem_Nome.
Em vez de dar o System.out.println, exibi toda a String na caixa do campo
txNome e depois colei no Word. :smiley:
Daí pude ver todos os erros da SQL.

O meu código ficou assim:

private void Salvar_Update() {
        String editarFun = null;
        int vcargo = 0, vsetor = 0;
        vcargo = cbCargo.getSelectedIndex();
        vsetor = cbSetor.getSelectedIndex();
        try {
            int cod_fun = 0;
            cod_fun = Tfun.rs.getInt("FUN_COD");
            editarFun = "UPDATE FUNCIONARIOS SET FUN_NOME ='" + txNome.getText() + "',FUN_CPF='"
                    + txCPF.getText() + "', FUN_RG='" + txRG.getText() + "', FUN_CEP='"
                    + txCEP.getText() + "', FUN_NUMERO='" + txNumero.getText() + "', FUN_COMPLE='"
                    + txComple.getText() + "', FUN_TEL='" + txTele.getText() + "', FUN_CARGO='"
                    + vcargo + "', FUN_SETOR='" + vsetor + "', FUN_SALARIO='" + txSalario.getText()
                    + "', FUN_SEXO='" + sexo + "'"
                    + " WHERE FUN_COD=" + cod_fun + ";";
            Tfun.st.executeUpdate(editarFun);
            JOptionPane.showMessageDialog(null, "FUNCIONARIO alterado com Sucesso!!!");
            Tfun.exeSQL("SELECT * FROM FUNCIONARIOS");
        } catch (SQLException erro) {
            JOptionPane.showMessageDialog(null, "Erro ao Salvar!" + "\n" + erro + "\n" + editarFun);
        }
        txNome.setText(editarFun);
    }

Mais uma vez, grato a todos!

lele_vader

Não use concatenação de strings, isso além de não ser performático, pois a cada concatenação você cria uma 3 string, permite SQL Injection.
Use uma classe como StringBuilder e use o método append.

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html

lele_vader

E use preparedStatement como alguém falou.
Ficará mais legível.

Por fim faltou fechar o statement e a connection em um bloco finally, ou usar o fechamento automático de recursos do java 7.

Criado 21 de setembro de 2012
Ultima resposta 21 de set. de 2012
Respostas 8
Participantes 7