Como atualizar (Update) Banco de dados com os dados da Tabela(Jtable) ? [RESOLVIDO]

Boa tarde,

Estou com o seguinte problema.
Eu pego os dados de uma tabela do banco de dados e listo na JTable. //Até ai tudo bem
Então altero os dados nos campos da JTable e Aperto no botão “salvar”, o qual se encarrega de fazer o Update de todas as linhas da Jtable para a tabela
do banco de dados, mas por algum motivo que eu desconheço não funciona, ele não altera/atualiza/update os dados da tabela.

 public void alteraNoBanco(){
        try { 
          Connection conn = null; 
          Class.forName("oracle.jdbc.driver.OracleDriver");
          String url = "jdbc:oracle:thin:system/oracle@127.0.0.1:1521/XE";
          conn = DriverManager.getConnection(url);
          
          try{
          String sql = "update atendimento set  solicitante = ?, departamento = ?, dataSolicitacao = ?, solicitacao = ?, caracteristica = ?, dataAtendimento = ?, solucao = ?, atendente = ?  where chamado = ?";
          String sqlCont = "select * from atendimento";
          
          PreparedStatement ps = conn.prepareStatement(sql);   
          
          PreparedStatement cont = conn.prepareStatement(sqlCont);
          
          ResultSet rs = cont.executeQuery();
          int numeroChamados=0;
          while(rs.next()){
          numeroChamados = rs.getInt("chamado");
          }
          
          int linha=0;
          for(linha=0; linha<numeroChamados;linha++){
            
          ps.setObject(1, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 1));
          ps.setObject(2, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 2));
          ps.setObject(3, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 3));
          ps.setObject(4, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 4));
          ps.setObject(5, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 5));
          ps.setObject(6, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 6));
          ps.setObject(7, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 7));
          ps.setObject(8, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 8));
          ps.setObject(9, linha);
          ps.executeUpdate();
          
          }
          JOptionPane.showMessageDialog(null, "Registro alterado");
          } finally{
              conn.close();
          }
          
        } catch (Exception ex) {
            ex.printStackTrace();
        } 
    }

Mais algumas informações:
O código não gera Erro nenhum, e a coluna 0(ZERO) não é Setada pois é a coluna de Código, esta nunca ira ser alterada.

ONDE ESTOU ERRANDO?

Obrigado.

o banco está sendo atualizado ?
se sim vc tem q pegar os dados novamente e carregar a jtable;

Você está perguntando se o que eu quero é Atualizar o Banco?
Sim, é isso mesmo, quero dar um update de todas as linhas da minha JTable para o banco de dados.
O problema é que ele não seta os novos valores que eu alterei nos campos da JTable.
Como assim carregar a JTable? Quéres dizer listar novamente para ver os novos valores que estão no banco?

Exatamente.

Vc altera no JTable só que não lhe aparece a alteração, mas verifica se no banco deu certo (como o kdoigor disse).
Se altera no banco, o que vc deve fazer é dar um select recuparando novamente a tabela, depois de alterar no JTable.

Abraço

Boa tarde Thiago,

Infelizmente não altera no banco de dados.
A idéia do que quero fazer é simples, e a solução que implementei também, não entendo o que esta errado.
Pois eu listo tudo que tem no BD na JTable, deixei os campos como “editável”, eu edito eles e executo o código acima no qual
a idéia é pegar os valores de cada coluna e dar update na linha, vou pra próxima linha e faço o mesmo e assim por diante até o fim da tabela.

Falca cara,

Meu, faz um teste:

Tira o for :

for(linha=0; linha<numeroChamados;linha++){

Daí, seta o setObject com qualquer valor, mas não sendo o valor contido nos Campos do JTable.

ps.setObject(1,"Eduardo"); ps.setObject(2,"Vendas");

E veja se altera no BD.

Ah, me explica uma coisa: O que significa o campo “chamado”?
O número de chamados equivale ao número de registros no BD?
Por isso do:

while(rs.next()){ numeroChamados = rs.getInt("chamado"); }

Se é isso, não deveria ser

numeroChamados+=rs.getInt("chamado");

Abraço.

Bom dia Thiago,

Fiz o teste solicitado e realmente não atualizou no BD, onde sera que esta o problema?

O número de chamados é o numero de registros como você falou.
Não deveria ser como você colocou pelo motivo que essa linha:

numeroChamados = rs.getInt("chamado");

retorna o valor que está no campo chamado. Então por exemplo:
Tenho o:chamado
1
2
3
e assim por diante… com esse while eu pego o valor da última linha, no caso ali “3”, que significa o número total de registros.
Não sei se você entendeu ou se fui muito confuso.

Agora voltando ao update, através deste teste percebemos que o problema não estaria no FOR ou no pegar valores da tabela e sim no Update,
mas onde estaria o erro?

Abraço.

Bom, suponhamos que você tenha 10 chamados no seu Banco de Dados, o que resultará em 10 linhas em sua JTable. Os códigos dos seus chamados no BD (coluna “chamado” pelo que entedi) estão numerados de um a dez??? Você não poderia, por exemplo, ter no seu Banco:

3 - Chamado 1 4 - Chamado 2 10 - Chamado 3 15 - Chamado 4 16 - Chamado 5 ...

Não sei se expliquei direito, mas o que quero dizer é que, não necessáriamente os registros dos seu BD vão ter números sequenciais, sem “buracos” entre eles.

T+

Bom tarde diego,

Se entendi certo isso não pode ocorrer, pois CHAMADO recebe o valor da linha + 1.
Por exemplo, se for um registro na linha ZERO(0), o numero do chamado vai ser 0+1 = 1.
Se for linha 324 o numero do chamado vai ser 324+1 =325 ou seja nunca ira ter buracos.
Não sei se expliquei certo e se era isso que você queria dizer.

Continuo na dúvida do que pode estar incorreto no meu Update.
Segue o código novamente:

[code] public void alteraNoBanco(){
try {
Connection conn = null;
Class.forName(“oracle.jdbc.driver.OracleDriver”);
String url = “jdbc:oracle:thin:system/philips@127.0.0.1:1521/XE”;
conn = DriverManager.getConnection(url);

      try{
      String sql = "update atendimento set solicitante = ?, departamento = ?, dataSolicitacao = ?, solicitacao = ?, caracteristica = ?, dataAtendimento = ?, solucao = ?, atendente = ?  where chamado = ?";
      String sqlCont = "select * from atendimento";
      
      PreparedStatement ps = conn.prepareStatement(sql);   
      PreparedStatement cont = conn.prepareStatement(sqlCont);
      
      
      ResultSet rs = cont.executeQuery();
      int numeroChamados=0;
      while(rs.next()){
      numeroChamados = rs.getInt("chamado");
      }
      
      int linha=0;
      for(linha=0; linha<numeroChamados;linha++){
        
      ps.setObject(1, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 1));
      ps.setObject(2, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 2));
      ps.setObject(3, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 3));
      ps.setObject(4, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 4));
      ps.setObject(5, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 5));
      ps.setObject(6, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 6));
      ps.setObject(7, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 7));
      ps.setObject(8, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 8));
      ps.setObject(9, linha);
      ps.executeUpdate();
      conn.commit();
    
      
      }
      
      JOptionPane.showMessageDialog(null, "Registro alterado");
      } finally{
          conn.close();
      }
      
    } catch (Exception ex) {
        ex.printStackTrace();
    } 
}[/code]

Mais porque não pode ter buracos?? Suponhamos que você cadastrou 20 chamados. Então foi lá e apagou o chamado 11, e cadastrou mais dois. Teoricamente, seus registros devem ficar assim:

1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22

Isso tudo é suposição, pois não sei como é a lógica do seu negócio…

T+

Boa tarde Diego,

Entendi perfeitamente o que você quis dizer… É que não trabalho com a exclusão física do registro, ele fica como inativo, ou seja, se eu “apagar” o chamado 11, ele continuara la no banco de dados a unica coisa que irá mudar é que escolherei um dos campos para colocar uma “situação” como INATIVO. Entende?
Desculpa se te confundi.
Mas voltando ao “Update”, você teria alguma idéia do porque não está funcionando?

Bom, uma coisa que notei é que você fez:

ps.setObject(9, linha);

Não seria:

ps.setObject(9, linha + 1);

Sendo que não existe o chamado zero??

T+

[quote=vini.roggia]Boa tarde Diego,

Entendi perfeitamente o que você quis dizer… É que não trabalho com a exclusão física do registro, ele fica como inativo, ou seja, se eu “apagar” o chamado 11, ele continuara la no banco de dados a unica coisa que irá mudar é que escolherei um dos campos para colocar uma “situação” como INATIVO. Entende?
Desculpa se te confundi.
Mas voltando ao “Update”, você teria alguma idéia do porque não está funcionando?

[/quote]

Puts cara, sei lá, já deu uma conferida nos nomes dos campos, para ver se estão iguais ao da String sql. Essas coisa, sei lá.

Mas que problema em cara :smiley:

Boa tarde pessoal,

Então, cheguei a solução com a ajuda de um amigo e colega de facul.
O erro é o seguinte:

ps.setObject(9, linha);

deve ser:

ps.setObject(9, tbAtendimentoAlteraRegistro.getModel().getValueAt(linha, 0));

Estou com mais alguns problemas básicos, mas para responder e terminar com este tópico é isso.
Muito obrigado a todos.

Pessoal estou com um problema parecido… carego em um jtable os dados de uma tabela do banco de dados. Eu quero selecionar uma a linha do registro q eu quero alterar, clicar no botão altera, e abrir a nova janela de alteração com os dados do resgistro q eu quero alterar.

segue o codigo do botão alterar:

int LinhaSelecionada = this.jTablePacientes.getSelectedRow();
        String cod = this.jTablePacientes.getValueAt(LinhaSelecionada, 0).toString();

        new AlteraPaciente(cod).setVisible(true);

segue o codigo da janela de alteração:

public class AlteraPaciente extends javax.swing.JFrame {
    ConectaBanco con_paciente;
    String cod;
    /** Creates new form JF_FichaPaciente */
    public AlteraPaciente(String cod) {
        initComponents();
        //Inicia a classe ConectaBanco
        con_paciente = new ConectaBanco();
        con_paciente.OpenDB();

        //Busca os dados do paciente a ser alterado pelo código do paciente
        con_paciente.QuerySQL("SELECT * FROM pacientes WHERE cod_paciente = '"+cod+"'");
        try{
            
            txtCodigo.setText(con_paciente.rs.getString("cod_paciente"));
            txtNome.setText(con_paciente.rs.getString("nome_pac"));
            txtRG.setText(con_paciente.rs.getString("rg_pac"));
            txtCPF.setText(con_paciente.rs.getString("cpf_pac"));
            txtNasc.setText(con_paciente.rs.getString("dtnasc_pac"));
            txtRua.setText(con_paciente.rs.getString("endereco_pac"));
            txtNumero.setText(con_paciente.rs.getString("numero_pac"));
            txtCidade.setText(con_paciente.rs.getString("cidade_pac"));
            txtEstado.setText(con_paciente.rs.getString("estado_pac"));
            txtTel.setText(con_paciente.rs.getString("telefone_pac"));
            txtCel.setText(con_paciente.rs.getString("celular_pac"));
            txtEmail.setText(con_paciente.rs.getString("email_pac"));
        }
        catch(SQLException erro){

        }