Erro “Can not issue data manipulation statements with executeQuery()”

25 respostas
java
A
Olá à  todos sou novo, tenho estado a desenvolver um sistema, e tenho um problema num dos casos. Eu desejo fazer pesquisas avançadas ( adicionando o nome na barra de pesquisa ele preenche a tabela em tempo real), usando a biblioteca "rs2xml.jar", eis o código que estou usando:
public void PesquisarCliente (){

String sql = select * from tbcliente where nomecli like ?;

try {

conexao.prepareStatement(sql);

pr.setString(1, txtclipesquisa.getText()+ %);

rs = pr.executeQuery();
tbclientes.setModel(DbUtils.resultSetToTableModel(rs));
        
               } catch (SQLException e) {
                   JOptionPane.showMessageDialog(null, "Erro ao fazer Pesquisa: "+ e );
    }
}

Porém, ao digitar o nome do cliente na caixa de pesquisa, aparece o erro acima. O que poderá ser isso?

Grato desde já!

25 Respostas

M

Cara, acho na sua instrução sql, por se tratar de uma nome gerenciado por um like, tente colocar isso : ‘?’

dessa forma:

String sql = “select * from tbcliente where nomecli like '?' ";

Minha consulta, em uma tabela de cidades, dessa forma funciona:

select * from cidade where nome like 'MURIAE';

sem as aspas simples, não.

select * from cidade where nome like MURIAE;

A

vou tentar , não havia reparado nisso antes.

A

Marcio, infelizmente não funcionou. Está vir esse erro:

Exception in thread AWT-EventQueue-0 java.lang.NullPointerException

at ao.com.infox.telas.TelaCliente.PesquisarCliente(TelaCliente.java:27)

at ao.com.infox.telas.TelaCliente.txtclipesquisaKeyReleased(TelaCliente.java:298)

at ao.com.infox.telas.TelaCliente.access$000(TelaCliente.java:17)

at ao.com.infox.telas.TelaCliente$1.keyReleased(TelaCliente.java:123)

at java.awt.Component.processKeyEvent(Component.java:6494)

at javax.swing.JComponent.processKeyEvent(JComponent.java:2832)

at java.awt.Component.processEvent(Component.java:6310)

at java.awt.Container.processEvent(Container.java:2236)

at java.awt.Component.dispatchEventImpl(Component.java:4889)

at java.awt.Container.dispatchEventImpl(Container.java:2294)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)

at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)

at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)

at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)

at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)

at java.awt.Component.dispatchEventImpl(Component.java:4760)

at java.awt.Container.dispatchEventImpl(Container.java:2294)

at java.awt.Window.dispatchEventImpl(Window.java:2746)

at java.awt.Component.dispatchEvent(Component.java:4711)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)

at java.awt.EventQueue.access$500(EventQueue.java:97)

at java.awt.EventQueue$3.run(EventQueue.java:709)

at java.awt.EventQueue$3.run(EventQueue.java:703)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)

at java.awt.EventQueue$4.run(EventQueue.java:731)

at java.awt.EventQueue$4.run(EventQueue.java:729)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Quando executo o programa de novo e faço a pesquisa, ele dá esse erro, mas quando adiciono e volto a pesquisar sem voltar a executar o programa, me lança a exceção do tópico!

M

AvelinoTrindade, se eu não estou enganado, no momento em que você faz a pesquisa, você seta para o primeiro parâmetro do seu preparedStatment o caracter “%”, então sua consulta fica dessa forma.

String sql = select * from tbcliente where nomecli like avelino%;

por isso te retorna essa exceção, tente fazer seu código dessa forma:

public void PesquisarCliente (){
            
            String sql = "select * from tbcliente where nomecli like '?%'”;
            try 
            {
                conexao.prepareStatement(sql);
                pr.setString(1, txtclipesquisa.getText());

                rs = pr.executeQuery();
                
             if(rs!=null){
                tbclientes.setModel(DbUtils.resultSetToTableModel(rs));
             }
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, "Erro ao fazer Pesquisa: "+ e );
            }
    }
A

Marcio, tentei fazer do jeito que você sugeriu, ele continua com o mesmo erro!

R

Se você colocar %, na frente ou atrás de uma string, o like entende que deve retornar qualquer coisa que venha acompanhado daquela string.

R

Se você tiver acesso direto ao banco, teste a Query direto nele e veja se retorna o que você espera.
Se retornar certo, o problema é no seu programa e não na Query.

A

No banco ele dá exatamente o resultado esperado, já tentei executar pelo workbench.

Rodrigo, talvez seja essa a razão que me leva buscar ajuda dos mais experientes por aqui, não consigo ver onde está o erro no código, admitindo a possível possibilidade dada pelo nobre Marcio, infelizmente não resultou!

A

Teste pelo workbench:

  • select * from tbcliente where nomecli like “B%”; *

Resultados:

‘1’, ‘Benza’, ‘11111’, ‘[email removido]’, ‘prenda’, ‘xaba’
‘2’, ‘Bagu’, ‘22222’, ‘[email removido]’, ‘rocha’, ‘xapeu’
‘3’, ‘Braulia’, ‘33333’, ‘[email removido]’, ‘cassequel’, ‘lourenço’
*

M

o Null pointer exception esta nesta linha>:
at ao.com.infox.telas.TelaCliente.PesquisarCliente(TelaCliente.java:27) -->> linha 27 do codigo TelaCliente.java , coloca trecho desta linha pra gente ver o que tá fazendo.

uma outra coisa, você esta colocando a pesquisa no evento KeyReleased do component, ou seja, a cada t tecla pressionada é disparado o evento , fazendo a busca, se pesquisar pelo nome “Marcos”, logo quando pressionar o “m” e soltar a tecla, já vai fazer a busca pela primeira letra pressionada , no caso o “M” , trazendo o erro Null Pointer. muda esse evento do seu botao para o KeyPressed e testa pra ver !

sem bem que não é pra trazer o null pointer exception mesmo quando pressionar o enter… pensando melhor o erro esta em outro lugar

M

Rodrigo, sou iniciante em programação, realmente você tem razão, dessa forma irá apenas adicionar o o caractere %, depois do nome pesquisado.

A

public void PesquisarCliente (){

String sql = "select * from tbcliente where nomecli like ?";
        try 
        {
            conexao.prepareStatement(sql);
            pr.setString(1, txtclipesquisa.getText()+ "%");

            rs = pr.executeQuery();  // Esse é o a linha do códio que aparece ali mano.
            
         if(rs!=null){
            tbclientes.setModel(DbUtils.resultSetToTableModel(rs));
         }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro ao fazer Pesquisa: "+ e );
        }
}
M

Avelino, boa tarde.

Cara, se sua pesquisa no workbenck funciona, tente posicionar o resultSet para a primeira linha válida da sua consulta, utilizando o método first do ResultSet, dessa forma.

A

Fiz do jeito e ainda continua dando exceção do “nullpoint”.

Se fizer um cadastro no momento e tentar pesquisar, ele manda a exceção do “Catch” com essa informação : “can not issue data manipulation statements with executequery”.

Estou desde manhã tentando entender, mas não consigo resolver o caso!

R

@avelinotrindade, Aconselho você a “debugar” o código e ver até onde ele funciona sem problemas, assim você vai saber exatamente a linha de código em que ele resulta o nullpoint e pode nos trazer para te ajudar.

A

Está bem!

M

Avelino, vamos com calma tentar desvendar o seu mistério.

Acho que o seu problema está nessa linha, tente mudar cara a sua sql, e deixar dessa forma:

String sql = “select * from tbcliente where nomecli like '”+JTextFild.getText()+"%’";

Fiz testes aqui na minha aplicação, e veja como ficou o meu JOPtionPane.

Erro

A

Infelizmente não deu também:

public void PesquisarCliente() {

String sql = "select * from tbcliente where nomecli like"+ txtclipesquisa.getText()+ "%" ;
    try {
        conexao.prepareStatement(sql);
        //pr.setString(1, txtclipesquisa.getText() + "%");

        rs = pr.executeQuery();
        if (rs != null) {
            rs.first();
            tabelaclientes.setModel(DbUtils.resultSetToTableModel(rs));

        }

    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "Erro ao fazer Pesquisa: " + e);
    }
}
M

Qual foi o erro dessa vez?

A

Ele me dá este erro também, mas isso se eu não sair do programa, cadastrar um novo cliente e tentar fazer pesquisa, ele me dá esse erro. Agora se eu sair e voltar a abrir o programa, tão logo que digito uma palavra na caixa de pesquisa, ele dá o erro de “nullpointExcpetion”.

M

depois ,

esse conexao.preparedStament(sql); , é o prepaparedStatement que esta vindo da classe conexão ?? ,
depois

esse pr.executeQuery(); deve ser uma instancia do prepararedStament desta classe que você esta agora /? , você tá trazendo uma instância do preparedStament da classe conexao, e depois rs = pr,executeQuery(); desta própria Classe? , tá certo isso ?

M

posta o parte deste metodo, instancia deste conexao.preparedStatement(); pra vermos o que ele esta fazendo !

A

Desculpem por responder só agora, ontem me foi barrado por atingir o limite de resposta de novato por aqui. Mano Marcelo, eis ai no seu todo o método:

Connection conexao = null;

PreparedStatement pr = null;

ResultSet rs = null;

public void PesquisarCliente() {

String sql = "select * from tbcliente where nomecli like ?" ; // penso que essse é a parte que pedes para mostrar.
    try {
        conexao.prepareStatement(sql);
        pr.setString(1, txtclipesquisa.getText() + "%");

        rs = pr.executeQuery();
        if (rs != null) {
            rs.first();
            tabelaclientes.setModel(DbUtils.resultSetToTableModel(rs));

        }

    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "Erro ao fazer Pesquisa: " + e);
    }
}
M

meu, de onde vem a conexão com o banco de dados ?

sua conexão esta null, de onde vem a conexão do seu banco ?

M

Exatamente,ia perguntar a mesma coisa, provavelmente esse é o erro!

Criado 10 de janeiro de 2018
Ultima resposta 11 de jan. de 2018
Respostas 25
Participantes 4