[Resolvido] Método que atualiza toda uma coluna de uma tabela do BD MySQL

Bom dia Pessoal,

Estou enfrentando um pequeno problema atualmente, com um objeto que estou perdendo após fazer um statement.executeUpdate.
Após realizar a atualização no registro especifíco ele é fechado e eu não consigo continuar atualizando o resto da tabela…

Vou postar aqui os métodos que utilizo, qualquer coisa é só falar que passo mais informaçoes…
Se os métodos estiverem meio confusos é só falar, sou iniciante em Java.

public class Rotina_AtualizaBD {
    
    ConexaoServicos con_ferias =  new ConexaoServicos();
    ConexaoServicos con_copia = new ConexaoServicos();
    
    public void Rotina()
    {  
        try
        {
                //conecta com meu banco de dados
                con_ferias.conecta();
                //obtem a tabela de controle de férias
                con_ferias.executeSQL("SELECT * FROM controle_ferias");
                //vai para o primeiro registro da tabela
                con_ferias.resultset.first();
                
                do
                {
                    //faz uma cópia do objeto férias - não sei se posso fazer isso
                    con_copia = con_ferias; 
                    
                    //se for diferente de null ele entra para atualizar os meses
                    if(con_ferias.resultset != null) 
                    {
                                //método que retorna quantos meses eu tenho em um intervalo de datas
                                String quantMeses = pega_datas();
                                //obtem o id do controle
                                String controle = con_copia.resultset.getString("id_Controle_de_Ferias");
                                //atualiza o registro
                                atualiza_registros(quantMeses, controle); 
                    }
                    else
                        JOptionPane.showMessageDialog(null,"Não foi possivel atualiza registros....");                  

                //vai para o próximo registro, se não for posssivel sai da repetição, ele está saindo pois o resultset foi fechado
                }while(con_ferias.resultset.next());  
        }
        catch(SQLException erro)
        {
            JOptionPane.showMessageDialog(null,"Rotina não conseguiu percorrer resgistros e atualizar tabela!"+erro);
        }
    }
    
    public void atualiza_registros(String meses, String controle)
    {
        try
        {
            //atualiza diretamente no banco de dados
            String atualiza = "UPDATE controle_ferias SET meses_sem_ferias ="+meses+" WHERE id_Controle_de_Ferias ="+controle; 
            //fecha o resultset - esse é o problema
            con_copia.statement.executeUpdate(atualiza); 
            
            System.out.println("Registro atualizado com SUCESSO!!"+controle);
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Não foi possivel atualizar registros do Banco de Dados!");
        }
    }
    
    
    //método que chama a  classe CalculaMeses responsavel por calcular diferença entre datas 
    //retorna a quantidade de meses de diferença
    
    public String mesesSemFerias(String ate,  String atual)
    {    
         String mesesSem = "";
        
        try
        {
                //passa a data atual e a data da proxima ferias como parametro
                int calc = new CalculaMeses().calcularMeses(ate, atual); 

                mesesSem = String.valueOf(calc);
                
                return mesesSem;
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possivel atualizar banco de dados!"+erro);
        }
        
     return mesesSem;   
    }
    
    //pega as datas para o calculo
    public String pega_datas()
    {  
        String meses = "";
        
        try
        {                
                 //pega a data da proxima ferias no banco de dados
                 String dataProxima =  con_copia.resultset.getString("Proximas_ferias"); 
                 //pega a data atual
                 String dataHoje = new Data().DataAtual(); 
                 //calcula quantos meses tem de intervalo para as ferias
                 meses = mesesSemFerias(dataProxima, dataHoje); 
                 
                 return meses;
        }
        catch(SQLException erro)
        {
            JOptionPane.showMessageDialog(null,"Não foi possivel pegar Datas!");
        }
        return meses;
    }
}

O método funciona, mas somente está atualizando o primeiro registro da minha tabela.

Obrigada pela ajuda.
Fica aguardando…

Abraço.

Por que você não altera seu código pra fechar a conexão somente depois de completar tudo o que quer, talvez com um método novo…

Uhm, é uma boa idéia, mas não faço a mínima idéia de como fazer, você tem algum material para me indicar?

Obg ^^

Olha só franzzita no começo do seu codigo vc faz uma copia con_copia = con_ferias
depois la dentro do seu if(con_ferias.resultset !null)
quando entra ai dentro vc usa na variavel controle con_copia.resultset.getString
o que acontece no seu while vc da o next() no resultset con_ferias por isso so atualiza o mesmo registro
na hora de executar o seu sql ele esta usando sempre o mesmo registro, mude o con_ferias.resultset do if e do while para
con_copia. ou mude o valor que a variavel controle esta usando para con_ferias.resultset acho que o problema é esse !

OBSERVE OS COMENTÁRIOS EM MAIÚSCULOS FOI EU QUEM COLOQUIE PRA EXPLICAR ONDE ESTA SEU ERRO
OK

:smiley:

public class Rotina_AtualizaBD {  
      
    ConexaoServicos con_ferias =  new ConexaoServicos();  
    ConexaoServicos con_copia = new ConexaoServicos();  
      
    public void Rotina()  
    {    
        try  
        {  
                //conecta com meu banco de dados  
                con_ferias.conecta();  
                //obtem a tabela de controle de férias  
                con_ferias.executeSQL("SELECT * FROM controle_ferias");  
                //vai para o primeiro registro da tabela  
                con_ferias.resultset.first();  
                  
                do  
                {  
                    //OLHA SÓ ISSO AQUI É DESNECESSARIO NÃO PRECISA COPIAR VC NEM ESTA USANDO ESTA COPIA 
                    //VC SO USA ELA NA HORA DE PEGAR O REGISTRO PRA EXECUTAR O SQL E VC NÃO DA NEXT() NELA 
                    //FICA PEGANDO SEMPRE O PRIMEIRO REGISTRO 					
                    con_copia = con_ferias;   
                      
                    //AQUI VC ESTA USANDO O con_ferias.resultset 
                    if(con_ferias.resultset != null)   
                    {  
                                //método que retorna quantos meses eu tenho em um intervalo de datas  
                                String quantMeses = pega_datas();  
                                //AQUI NA SUA STRING DE SQL VC ESTÁ PEGANDO SEMPRE O PRIMEIRO REGISTRO DO RESULTSET
                                //PORQUE AQUI VC ESTA USANDO O OUTRO RESULTSET O con_copia.resultset OU SEJA SEMPRE PEGA O MESMO REGISTRO 
                                // FAZ ASSIM => String controle = con_ferias.resultset.getString("id_Controle_de_Ferias");  								
                                // VC NÃO PRECISA FAZER UMA COPIA DO SEU REULTSET NÃO É NECESSÁRIO 
								String controle = con_copia.resultset.getString("id_Controle_de_Ferias");  
                                //atualiza o registro  
                                atualiza_registros(quantMeses, controle);   
                    }  
                    else  
                        JOptionPane.showMessageDialog(null,"Não foi possivel atualiza registros....");                    
  
                //AQUI NO WHILE CV ESTA INDO PARA O PROXIMO RESGISTRO USANDO O NEXT NO con_ferias.resultset
                // JA O con_copia.resultset VC NÃO DA NEXT() AI ESTA SEMPRE NO PRIMEIRO REGISTRO
				}while(con_ferias.resultset.next());    
        }  
        catch(SQLException erro)  
        {  
            JOptionPane.showMessageDialog(null,"Rotina não conseguiu percorrer resgistros e atualizar tabela!"+erro);  
        }  
    }
}

Drockx,

Muito obrigada pela atenção!
Vou fazer as alterações e realizar alguns testes, logo posto o resultado!

:smiley:

Então, fazendo essas alterações não deu certo, ele ainda continua atualizando o primeiro registro.

Eu estava usando o con_copia como um objeto auxiliar, pois eu não podia executar statement.executeUpdate no con_ferias para não perder minhas informações. A copia serviria apenas para pegar o que fosse atual no con_ferias, o resto seria executado usando o con_copia mesmo. Essa foi a lógica que eu usei, mas acho que esse con_copia se tornou apenas um atalho, pois ele ta fechando o meu con_ferias mesmo assim.

:shock:

no seu metodo Rotina
vc estava usando no seu if e no seu while e na variavel controle
ambos o con_ferias.resultset ???

há sim tenta fazer o seguinte no seu metodo Rotina vc usa dentro dele somente o con_ferias.resultset

já so seu atualiza registros vc pode usar outro resultset pode até usar o con_copia.resultset só
que vc não pode fazer a copia quando vc faz copia são dois objetos apontando para mesma referencia é por
isso que o con_copia esta fechando o con_feiras use no inicio da sua classe vc ja instancia o con_copia e com isso vc ja pode usalo
sem fazer uma copia do con_feiras tenta isso ai !!

Cara que maravilha, deu certo!!!

\o/

Nem sei como agradecer, obrigada mesmo pelas dicas, estava travada nisso a 2 dias já…
^^

Olha como ficou:

[code]public class Rotina_AtualizaBD {

ConexaoServicos con_ferias =  new ConexaoServicos();
ConexaoServicos con_copia = new ConexaoServicos();



public void Rotina()
{  
    try
    {
            con_ferias.conecta();
            con_ferias.executeSQL("SELECT * FROM controle_ferias");
            con_ferias.resultset.first();
            
            //essas linhas foram adicionadas no lugar da copia errada que fiz do objeto
            con_copia.conecta();
            con_copia.executeSQL("SELECT * FROM controle_ferias");
            con_copia.resultset.first();
            
            do
            {
                
                if(con_ferias.resultset != null)
                {
                            String quantMeses = pega_datas();
                            String controle = con_ferias.resultset.getString("id_Controle_de_Ferias");
                            atualiza_registros(quantMeses, controle);
                }
                else
                    JOptionPane.showMessageDialog(null,"Não foi possivel atualiza registros....");
                
                con_ferias.resultset.next();
                
            }while(con_ferias.resultset != null);
    }
    catch(SQLException erro)
    {
        JOptionPane.showMessageDialog(null,"Rotina não conseguiu percorrer resgistros e atualizar tabela!"+erro);
    }
}

public void atualiza_registros(String meses, String controle)
{
    try
    {
        String atualiza = "UPDATE controle_ferias SET meses_sem_ferias ="+meses+" WHERE id_Controle_de_Ferias ="+controle;
        
        //aqui passei a utilizar o objeto cópia
        con_copia.statement.executeUpdate(atualiza);
        
        System.out.println("Registro atualizado com SUCESSO!!"+controle);
    }
    catch(Exception erro)
    {
        JOptionPane.showMessageDialog(null, "Não foi possivel atualizar registros do Banco de Dados!");
    }
}


public String mesesSemFerias(String ate,  String atual)
{    
     String mesesSem = "";
    
    try
    {
            int calc = new CalculaMeses().calcularMeses(ate, atual); 

            mesesSem = String.valueOf(calc);
            
            return mesesSem;
    }
    catch(Exception erro)
    {
        JOptionPane.showMessageDialog(null,"Não foi possivel atualizar banco de dados!"+erro);
    }
    
 return mesesSem;   
}


public String pega_datas()
{  
    String meses = "";
    
    try
    {                
             //em vez de usar a copia utilizei o objeto con_ferias
             String dataProxima =  con_ferias.resultset.getString("Proximas_ferias");
             
             String dataHoje = new Data().DataAtual();
             
             meses = mesesSemFerias(dataProxima, dataHoje); 
             
             return meses;
    }
    catch(SQLException erro)
    {
        JOptionPane.showMessageDialog(null,"Não foi possivel pegar Datas!");
    }
    return meses;
}

}
[/code]

:-o

Obrigada Obrigada mesmo!! o/

Que bom fico feliz em saber pude ajudar de alguma forma

:smiley: