Estou tendo um probleminha em remover um produto do meu projeto.
Pois clico em remover e ele diz que foi removido com sucesso!
Mas se eu buscar ele novamente ele aparece. :shock:
Código produtodao:
public void remove (produto C) throws SQLException{
String sql = "delete from produto where codigo =?";
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
stmt.setString(1,C.getCodigo());
stmt.execute();
stmt.close(); }
Botão Excluir:
[code]
public void excluirproduto() throws SQLException {
int resposta = JOptionPane.showConfirmDialog(this, “Deseja realmente excluir este produto?”,
“Confirmação”, JOptionPane.YES_NO_OPTION);//criar uma tela para perguntar se quer ou não excluir
if (resposta == JOptionPane.YES_NO_OPTION) {
produtodao dao = new produtodao();
produto p= new produto();
p.setCod(jLabelcod.getText());
dao.remove§;
DefaultTableModel dtm = (DefaultTableModel) jTabletabelaproduto.getModel();
dtm.removeRow(jTabletabelaproduto.getSelectedRow());
DefaultTableModel dtm = (DefaultTableModel) jTabletabelaproduto.getModel();
dtm.removeRow(jTabletabelaproduto.getSelectedRow());
}else{
JOptionPane.showMessageDialog(null, "Seu Produto Não Foi excluido");
}
DefaultTableModel dtm = (DefaultTableModel) jTabletabelaproduto.getModel();
dtm.removeRow(jTabletabelaproduto.getSelectedRow());
}[/code]
O que pode ser?? :?
a transação do remove está esperando a confirmação (commit) para ser concluída, ou seja, ja está na fila de transações do banco, mas não fez nenhuma persistencia ainda. Pegue o objeto que gerencia a sua conexão (No seu caso é conexao) e execute o commit (conexao.commit() após a execução da query, que sua transação será concluída e efetivada no banco.
Olha eu acredito que o fato de vc estar recebendo a mensagem de produto removido com sucesso seja desse item:
if (resposta == JOptionPane.OK_OPTION){
JOptionPane.showMessageDialog(null, "Produto excluido com sucesso");
.....
}else{
JOptionPane.showMessageDialog(null, "Seu Produto Não Foi excluido");
}
vc esta testando se o botao da interface foi apenas clicado ou nao em “if (resposta == JOptionPane.OK_OPTION)”, ou seja se vc clicar em ok eu presumo, ele dara a mensagem de que o produto foi excluido com sucesso e para sua surpresa nao foi. acredito que o problema esteja quando vc utiliza o :
produto p= new produto();
p.setCod(jLabelcod.getText());
Utilizando o getText() acredito que vc esteja utilizando o cod do produto como String e nao como Integer
de repente fazendo assim possa resolver o seu problema:
produto p= new produto();
p.setCod(new Integer(jLabelcod.getText()));
Isso tambem se o codigo do produto na classe produto for Integer, alias teria como posta-la para poder analisar mais de pertoo seu problema???
Blz,
Vamos la então! A explicação do victorsp detalha o processo de commit.
Assim vc pode implementar desta forma o metodo de remoção.
public void remove (produto C) throws SQLException{
String sql = "delete from produto where codigo =?";
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
stmt.setString(1,C.getCodigo());
stmt.execute();
stmt.commit(); //<-- Aqui vc esta confirmando para o banco que o item pode ser removido
stmt.close();
}
Patricia, o código que você colocou está correto.
Qual o banco de dados que você está utilizando?
Todas os meus métodos de deletar, usando JDBC (Oracle, MySQL e MSSQL Server) são assim.
Nunca precisei colocar o commit para qualquer query
Ah, sim, modifique teu método, coloque a parte da exclusão entre o try/catch
public void remove (produto C) throws SQLException{
try{
String sql = "delete from produto where codigo =?";
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
stmt.setString(1,C.getCodigo());
stmt.execute();
stmt.close(); }catch(Exception e){
e.printStackTrace();
}
Como você está “jogando” o erro com throws, não sabe se está ou não conseguindo criar a conexão, ir ao banco e executar a query. Mas, como o usuário selecionou “Ok”, ele irá informar que deletou com sucesso.
É assim do lado do meu painel excluir tem outro com a tabela para
pesquisar!!
Eu clico p/pesquisar na tabela excluo ele e ele some da tabela!
Mas se eu pesquisar novamente ele volta!!
Conectando ao banco
Conectando ao banco
Conectando ao banco
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: -1
at java.util.Vector.removeElementAt(Vector.java:515)
at javax.swing.table.DefaultTableModel.removeRow(DefaultTableModel.java:446)
at projetofinalpatriciass.excluirproduto.excluirproduto(excluirproduto.java:442)
at projetofinalpatriciass.excluirproduto.jButtonexcluirprodutoActionPerformed(excluirproduto.java:319)
at projetofinalpatriciass.excluirproduto.access$000(excluirproduto.java:27)
at projetofinalpatriciass.excluirproduto$1.actionPerformed(excluirproduto.java:113)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6288)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6053)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Conectando ao banco
Já estamos começando a evoluir.
Porém, esse erro acontece depois da chamada ao método de deleção.
Deve haver algo antes.
Aliás, o erro referido diz que não foi possível deletar a linha.
O que há de errado? Você tem dois elementos na lista e tenta remover o da posição três (lembre-se, inicia-se em 0, portanto, 0-1-2), e gera aquela exceção.
Por isso o machado disse que pode ser algo antes do remove