Duvida Pacote DAO Remove

25 respostas
P

Olá Pessoal!!

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:
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(p);
             DefaultTableModel dtm = (DefaultTableModel) jTabletabelaproduto.getModel();
             dtm.removeRow(jTabletabelaproduto.getSelectedRow());

            }

            if (resposta == JOptionPane.OK_OPTION){
 JOptionPane.showMessageDialog(null, "Produto excluido com sucesso");
        jTextFieldproduto.setText("");
        jTextFieldmarca.setText("");
        jTextFieldmodelo.setText("");
        jTextFieldcor.setText("");
       jTextFieldgarantia.setText("");
        jTextFieldvalor.setText("");
        jLabelcod.setText("");

        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());
    }
O que pode ser?? :?

25 Respostas

quebrado

Ola.
Depois do de executar a operação de o commit.
t+

P

Desculpe mas ñ intendi :?

victorsp

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():wink: após a execução da query, que sua transação será concluída e efetivada no banco.

P

victorsp

Poderia ser mais específico sou nova na área e não
compreendi o que vc disse :oops:
Desculpe :oops:

FacaNaCaveira

Ola Patricia SS, td blz???

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???

Abracao
Max

quebrado

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(); }

Qualquer coisa é so falar.
t+

P

quebrado

Intão eu coloquei esse commit,ma ficou errado.
Tenho que colocar ele em algum outro lugar? :shock:

drsmachado

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

P

Olá drsmachado

Estou usando o MySQL.

Se eu colocar o commit ele fica errado :?

drsmachado

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.

P

drsmachado

Obrigado pela ajuda!
Mas ainda não exclui :?

Desculpe o incomodo!!

drsmachado

Ok, mas ele cai na exception ou executa?

P

Cm assim? :shock:

É 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!!

:evil:

drsmachado

Ele irá sumir da tabela, pois você tem uma parte do programa que faz isto. Certo?

dtm.removeRow(jTabletabelaproduto.getSelectedRow());

Porém, se você colocou o try/catch e observar no console da IDE, poderá ver se ele dá um erro ou se executa normalmente o código.

P

Ao excluir [tentar] da esse erro:

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

drsmachado

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.

P

kkk eu ja estou pensando em desistir :x

cm assim algo antes?

drsmachado

Olhe a sequencia, você instancia o DAO, chama o método para remover e só depois disso, remove a linha (ou tenta)

produtodao dao = new produtodao();  
            produto p= new produto();  
            p.setCod(jLabelcod.getText());  
             dao.remove(p);  
             DefaultTableModel dtm = (DefaultTableModel) jTabletabelaproduto.getModel();  
             dtm.removeRow(jTabletabelaproduto.getSelectedRow());

Para que ele não delete, pode estar acontecendo um erro antes da chamada ao método removeRow.

nel

Patricia SS:
kkk eu ja estou pensando em desistir :x

cm assim algo antes?

Só acrescentando, o erro é basicamente isso aqui:

suaList.add(0);
suaList.add(1);
suaList.remove(2);

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 :smiley:

Abraços.

drsmachado

nel:
Patricia SS:
kkk eu ja estou pensando em desistir :x

cm assim algo antes?

Só acrescentando, o erro é basicamente isso aqui:

suaList.add(0);
suaList.add(1);
suaList.remove(2);

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 :smiley:

Abraços.


Eu me refiro a um provável e possível erro em alguma parte do DAO, seja ao buscar o Driver, ao criar a Connection, ao criar a PreparedStatement ou ao executá-la.
Isto pelo fato de toda esta parte ser anterior à exception lançada quando há a tentativa de eliminar a linha selecionada.

nel

drsmachado:
nel:
Patricia SS:
kkk eu ja estou pensando em desistir :x

cm assim algo antes?

Só acrescentando, o erro é basicamente isso aqui:

suaList.add(0);
suaList.add(1);
suaList.remove(2);

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 :smiley:

Abraços.


Eu me refiro a um provável e possível erro em alguma parte do DAO, seja ao buscar o Driver, ao criar a Connection, ao criar a PreparedStatement ou ao executá-la.
Isto pelo fato de toda esta parte ser anterior à exception lançada quando há a tentativa de eliminar a linha selecionada.

Há perfeito, fui mais especifico a exceção do Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: Array index out of range: -1. :slight_smile:

P

Agora sim q ñ intendi nd u_ú

nel

Patricia, se concentra primeiramente no que o Machado disse.
O que eu exemplifiquei foi que tu postou uma exceção, essa:

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

A exceção ocorre aqui at projetofinalpatriciass.excluirproduto.excluirproduto(excluirproduto.java:442).
É muito provavel que tu esteja dando um remove na sua DefaultTableModel em uma posição inexistente, entende?
Como se tu tivesse 5 itens na sua TableModel e tentasse remover o item de número 6. Veja quantos valores há inseridos nela e a posição que está passando para ser removida.

Abraços.

Master.Abs

Eu costumo fazer os testes do DAO antes de implementar em qualquer lugar.
Crie um main e faça o teste. Se passar pelo menos no main vc saberá que o problema não
é o DAO.

//DAO
public boolean deletarProduto(Produto produto) throws SQLException {
		String sql = "select * from produto";
		PreparedStatement ps = factory.getConnection().prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			if(rs.getInt(1) == produto.getPkproduto()){
				sql = "DELETE FROM produto WHERE pkproduto = ?";
				ps = factory.getConnection().prepareStatement(sql);
				ps.setInt(1, produto.getPkproduto());
				ps.execute();
				ps.close();
				return true;				
			}
		}
		ps.close();
		return false;
	}

//Main
public static void main(String[] args) {
		ProdutoDao dao = new ProdutoDao();
		Produto produto = new Produto();
		produto.setPkproduto(6);
		
		try {
			if(dao.deletarProduto(produto)){
				System.out.println("deletado");
			}else{
				System.out.println("Id não encontrado");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}

Faça o teste ai. valeu

drsmachado

Master.Abs:
Eu costumo fazer os testes do DAO antes de implementar em qualquer lugar.
Crie um main e faça o teste. Se passar pelo menos no main vc saberá que o problema não
é o DAO.

//DAO
public boolean deletarProduto(Produto produto) throws SQLException {
		String sql = "select * from produto";
		PreparedStatement ps = factory.getConnection().prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			if(rs.getInt(1) == produto.getPkproduto()){
				sql = "DELETE FROM produto WHERE pkproduto = ?";
				ps = factory.getConnection().prepareStatement(sql);
				ps.setInt(1, produto.getPkproduto());
				ps.execute();
				ps.close();
				return true;				
			}
		}
		ps.close();
		return false;
	}

//Main
public static void main(String[] args) {
		ProdutoDao dao = new ProdutoDao();
		Produto produto = new Produto();
		produto.setPkproduto(6);
		
		try {
			if(dao.deletarProduto(produto)){
				System.out.println("deletado");
			}else{
				System.out.println("Id não encontrado");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}

Faça o teste ai. valeu

Sempre faço isso mesmo.
Geralmente, meu DAO contém todas as possibilides do CRUD, então, já insiro, pesquiso e removo.
Deu certo, to programando…

Criado 21 de junho de 2011
Ultima resposta 22 de jun. de 2011
Respostas 25
Participantes 7