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.
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
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);
}
}
}
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.
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 !!