[Resolvido] Erro ao executar pesquisa

8 respostas
CarlosFontana

Boa noite pessoal, estou tentando fazer uma pesquisa em uma tabela onde, quando digitado o nome em um JTextField somente os dados com as características digitada permaneçam da JTable, tenho o seguinte código:

public void campoPesquisa(String sql) {
        try {
            dtm.setNumRows(0);
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            int colunas = rs.getMetaData().getColumnCount();
            Vector dados;
//            rs.first();
            do {
                dados = new Vector();
                for (int i = 1; i <= colunas; i++) {
                    dados.add(rs.getObject(i));    // Quando eu executo, consta erro nesta linha, a intenção é saber quantas colunas tem a tabela para popular ela.
                }
                dtm.addRow(dados);
            } while (rs.next());
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível pesquisar");
            e.printStackTrace();
        }
    }

Alguém tem ideia do que pode ser?

8 Respostas

ribclauport

Voce não deu rs.next() e está tentando dar um rs.getObject(), o cursor não está apontando para o objeto entende, use um while com rs.next() ae então quando entrar na iteração o result set estará disponível.

CarlosFontana

Blz ribclauport, mas o rs.next já está na condição do “do…while(rs.next)

ribclauport

Veja bem, no seu código tenta dar um rs.getObject() antes de mover o cursor do ResultSet:

Ou seja o rs.next está no final da iteração, já que você esta usando “do while”, o que eu disse é que voce primeiro usa res.next(), porque esse metodo retorna boolean e move o cursor para o próximo ResultSet, ou melhor dizendo para a próxima “tupla”, da forma que voce ta fazendo vai dar erro. use um While simples, como abaixo:

while(rs.next()){ //aqui se for true entra no codigo com o result set disponivel para manipulação

   //faz o que tem que fazer.
}
CarlosFontana

Obrigado pelo esclarecimento, fiz a alteração e quando executo a aplicação não me retorna nenhum erro, porém não está fazendo a consulta :S
Estou fazendo a ação dentro do construtor da classe:

campoPesquisa.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String nome = campoPesquisa.getText();
                JOptionPane.showMessageDialog(null,"" + campoPesquisa.getText());
                String consulta = "SELECT * FROM ESTADO WHERE ESTNOME LIKE '%"+nome+"%'";
                campoPesquisa(consulta);
            }
        });

…o método de pesquisa:

public void campoPesquisa(String sql) {
        try {
            dtm.setNumRows(0);
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            int colunas = rs.getMetaData().getColumnCount();
            Vector dados;
//            rs.first();
            while(rs.next()){
                dados = new Vector();
                for (int i = 1; i <= colunas; i++) {
                    dados.add(rs.getObject(i));
                }
                dtm.addRow(dados);
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível pesquisar");
            e.printStackTrace();
        }
    }
ribclauport

Montei aqui a tabela, rodei seu método, debuguei as variáveis e o retorno está vindo... acredito que novamente o erro esta na hora de montar ae sua view:

Veja o codigo que usei, está fora dos padrões pois montei so para testar, se estava indo no banco certinho, e o seu metodo so alterei a entrada fixa, e a forma
de obter a conexão para meu banco:

package meupacote;
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.SQLException;  
  
public class ConnectionFactory {  
  
    public static Connection getConnection() throws SQLException {     
        try {     
            Class.forName(&quot;com.mysql.jdbc.Driver&quot;);     
                 
            return DriverManager.getConnection(  
                    &quot;jdbc:mysql://localhost:3306/livraria&quot;, &quot;root&quot;, &quot;root&quot;);    
            } catch (ClassNotFoundException e) {     
            throw new SQLException(e.getMessage());     
            }     
                 
        }   
      
}
package dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class Util {
	static int cont = 1;
	public static void inserirEstados(Connection con) throws MyClassException {
		try {
			String createString = &quot;insert into estado ( cod_estado , ESTNOME ) &quot;
					+ &quot;VALUES (&quot; + ++cont +&quot;,'Maranhão') &quot;;
			con.createStatement().execute(createString);

		} catch (SQLException e) {
			Util u = new Util();
			Util.MyClassException mc = u.new MyClassException(
					&quot;problema ao inserir dados, causa: &quot; + e.getCause());
			throw mc;

		}
	}

	class MyClassException extends Exception {
		private static final long serialVersionUID = 1L;
		private String mensagem = &quot; &quot;;
		private String classe = &quot; &quot;;
		private String pacote = &quot; &quot;;
		private String metodo = &quot; &quot;;

		public MyClassException() {
			super();
		}

		public MyClassException(String p_str) {
			super(p_str);
		}

		public MyClassException(Throwable arg0) {
			super(arg0);
		}

		public MyClassException(String arg0, Throwable arg1) {
			super(arg0, arg1);
		}

		public void setClasse(String pclasse) {
			this.classe = pclasse;
		}

		public String getClasse() {
			return (this.classe);
		}

		public void setMensagem(String pmensagem) {
			this.mensagem = pmensagem;
		}

		public String getMensagem() {
			return (this.mensagem);
		}

		public void setPacote(String ppacote) {
			this.pacote = ppacote;
		}

		public String getPacote() {
			return (this.pacote);
		}

		public void setMetodo(String pmetodo) {
			this.metodo = pmetodo;
		}

		public String getMetodo() {
			return (this.metodo);
		}
	}

	static public void executaCriacao(String createString, Connection con)
			throws SQLException, MyClassException {
		Statement stmt;
		stmt = con.createStatement();
		stmt.execute(createString);
		stmt.close();
	}

	public static String criaEstado(Connection con) throws MyClassException {
		String createString = &quot;CREATE TABLE IF NOT EXISTS estado &quot;
				+ &quot;(cod_estado int, &quot; + &quot;  ESTNOME VARCHAR(32) ,&quot;
				+ &quot;  primary key (cod_estado)&quot; + &quot; )&quot;;
		try {
			executaCriacao(createString, con);

			return null;
		} catch (SQLException e) {
			Util u = new Util();
			Util.MyClassException mc = u.new MyClassException(
					&quot;problema ao criar a tabela causa: &quot; + e.getCause());
			throw mc;

		}

	}

}
package meupacote;  
  
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import javax.swing.JOptionPane;

import dao.Util;
  
class Exemplo1 {  
	
	static public void pesquisa(){
		//String nome = campoPesquisa.getText();  
		String nome = &quot;Maran&quot;;
        //JOptionPane.showMessageDialog(null,&quot;&quot; + campoPesquisa.getText());  
		JOptionPane.showMessageDialog(null,&quot;&quot; + nome);  
        String consulta = &quot;SELECT * FROM ESTADO WHERE ESTNOME LIKE '%&quot;+nome+&quot;%'&quot;;  
        campoPesquisa(consulta);  
	}
  
    public static  void campoPesquisa(String sql) {  
        try {  
            //dtm.setNumRows(0);  
           // PreparedStatement ps = BancoDados.getConexao().prepareStatement(sql); 
        	PreparedStatement ps = ConnectionFactory.getConnection().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();  
            int colunas = rs.getMetaData().getColumnCount();  
            Vector dados;  
 //            rs.first();  
            while(rs.next()){  
                dados = new Vector();  
                for (int i = 1; i &lt;= colunas; i++) {  
                	System.out.println(rs.getObject(i));
                    dados.add(rs.getObject(i));  
                }  
                
                
               // dtm.addRow(dados);  
            }  
        } catch (SQLException e) {  
            JOptionPane.showMessageDialog(null,&quot;Não foi possível pesquisar&quot;);  
            e.printStackTrace();  
        }  
    }  
    public static void main(String args[]) {  
  
        // A captura de exceções SQLException em Java é obrigatória para usarmos  
        // JDBC.  
        // Para termos acesso ao objeto con, ele deve ter um escopo mais amplo  
        // que o bloco try  
  
        Connection con = null;  
  
        try {  
            // Este é um dos meios para registrar um driver  
            Class.forName(&quot;com.mysql.jdbc.Driver&quot;).newInstance();  
  
            // Registrado o driver, vamos estabelecer uma conexão  
            con = ConnectionFactory.getConnection();
            
            Util.criaEstado(con);
            Util.inserirEstados(con);
            pesquisa();
           
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

A saida esta abaixo como um print, acredito que você deve mover o tópico para interfaces gráficas, abraço.

CarlosFontana

Obrigado pela ajuda ribclauport! Vou mover o tópico, valeu!

Essa é a minha interface:

Cara, não encontrei onde eu faço a alteração do tema dos tópicos, não são os moderadores que fazem isso?

ribclauport

Rapaiz, essa não sei heim, infelizmente com swing não posso te ajudar, eu não trabalho com swing, trabalho com web, se não conseguir mover poste novamente lá.

CarlosFontana

Acredito que pode ser algo relacionado a ordem das colunas que estão diferentes entre a tabela do banco e a JTable, alterei a ordem das colunas de forma que a ordem seja a mesma em ambas as tabelas mas, mesmo assim não está fazendo a pesquisa :S

Criado 29 de fevereiro de 2012
Ultima resposta 5 de mar. de 2012
Respostas 8
Participantes 2