Pesquisa em banco postgresql

19 respostas
jose_antonio_fernand
Boa tarde colegas, estou com um probleminha, e preciso da ajuda de voçês para solucionar. Criei um formulário em java, conectei com o banco postgresql, insiro dados neste banco através do formulario, consigo fazer consulta neste banco de alguns dados e outros não, por exemplo tenho uns membros de numeros 991,990,854,14,... consigo fazer uma pesquisa digitando no formulário os respectivos numeros de cadastro, ok. Mas tenho também outros membros com os números 1204, 1205, 1258 e quando digito alguns destes numeros de cadastros não consigo fazer a consulta e recebo de retorno a seguinte mensagem: (erro na consulta java.lang.StringIndexOutBoundsException: String index ouit of range:4), quando digito só o número 12 tenho como retorno os dados do membro 1204, que no banco se localiza antes do 1205 e 1258. Já o 1205 e o 1258 não consigo de jeito nenhum consultar seus dados. Queria enteder este mistério, e saber onde estou errando? segue parte do código para fazer a consulta.
public void consultar()
        {
       try
           {   
           obj_conexao.resultset.first();
            String igual = "n";
            int tamanho_pesquisa = jf_codigo.getText().length();
            while(igual.equals("n"))
            {
                String consultado = obj_conexao.resultset.getString("c_codigo").substring(0,(tamanho_pesquisa));
             if (consultado.equals(jf_codigo.getText()))
             {
                 igual = "s";
             }
                 else
                     obj_conexao.resultset.next();
             }
                
            jf_nome.setText(obj_conexao.resultset.getString("c_nome"));
            jf_end.setText(obj_conexao.resultset.getString("c_end"));
            jf_cidade.setText(obj_conexao.resultset.getString("c_cidade"));
            jf_congreg.setText(obj_conexao.resultset.getString("c_congreg"));
            jf_bairro.setText(obj_conexao.resultset.getString("c_bairro"));
            jf_uf.setText(obj_conexao.resultset.getString("c_uf"));
            jf_pai.setText(obj_conexao.resultset.getString("c_pai"));
            jf_mae.setText(obj_conexao.resultset.getString("c_mae"));
            jf_sexo.setText(obj_conexao.resultset.getString("c_sexo"));
            jf_cargo.setText(obj_conexao.resultset.getString("c_cargo"));
            jf_estado_civil.setText(obj_conexao.resultset.getString("c_estadocivil"));
            jf_local_batismo.setText(obj_conexao.resultset.getString("c_localbatismo"));
            jf_data_batismo.setText(obj_conexao.resultset.getString("c_databatismo"));
            jf_data_nascimento.setText(obj_conexao.resultset.getString("c_datanascimento"));
            jf_rg.setText(obj_conexao.resultset.getString("c_rg"));
            jf_cpf.setText(obj_conexao.resultset.getString("c_cpf"));
            jf_status.setText(obj_conexao.resultset.getString("c_status"));
            jf_obs.setText(obj_conexao.resultset.getString("c_obs"));
            mostrar_dados();        
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Erro na consulta "+erro);
        }       
    }

19 Respostas

iogui

Olá José,

Bom… fica difícil dizer algo sem ver o código que constroi a query. Ao que tudo indica, no momento de construção da query, você está acrescentando lixo ao parâmetro. Provavelmente, o número ‘04’. E imagino que você está montando a query apenas concatenando strings sem usar bindings mas estou apenas chutando já que vc não disponibilizou o código.
Outra coisa… Ao ver o seu código, imagino que você esteja criando um objeto que faz conexão ao banco e esteja disponibilizando acesso a um resultset por meio de um atributo público e isto é má pratica de programação. Me parece que seria um bom exercício, vc fazer um refactoring para corrigir este tipo de coisa no seu código pois pode ser que alguns problemas estejam sendo mascarados por um design mal elaborado.

Como sugestão, indico que você dê uma estudada no design patern DAO:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
http://javafree.uol.com.br/artigo/871452/Introducao-ao-pattern-DAO.html

[]s

jose_antonio_fernand
Bem colega, não entendi bem o seu posicionamento, mas segue o código da conexao. mesmo assim muito obrigado.
package aplicaca;

import java.sql.*;
import javax.swing.*;
public class conexa
{
       String driver = "org.postgresql.Driver";
       String url = "jdbc:postgresql://localhost/membros";
       String usuario = "postgres";
       String senha = "jose_fernan";
       private Connection conexao;
       public Statement statement;
       public ResultSet resultset;
        
      
       public boolean conecta()
       {
            boolean result = true;
            try 
            {
                Class.forName(driver);
                conexao = DriverManager.getConnection(url, usuario, senha);            
            }
            catch(ClassNotFoundException Driver) 
            {
               JOptionPane.showMessageDialog(null,"Driver não localizado");
               result = false;
            }
            catch(SQLException Fonte) 
            {
                JOptionPane.showMessageDialog(null,"Deu erro na conexao");
                result = false;
            }
            return result; 
       }
       
       public void desconecta()
       {
            boolean result = true;
            try 
            {
                conexao.close();
                JOptionPane.showMessageDialog(null,"banco fechado");
            }
            catch(SQLException fecha) 
            {
                JOptionPane.showMessageDialog(null,"Não foi possivel "+
                        "fechar o banco de dados: "+fecha);
                result = false;
            }

       }
      
       public void executeSQL(String sql)
       {
            try 
            {
                statement = conexao.createStatement(
                        ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
                resultset = statement.executeQuery(sql); 
               
            }
            catch(SQLException sqlex) 
            {
               JOptionPane.showMessageDialog(null,"Não foi possível "+
                       "executar o comando sql,"+sqlex+", o sql passado foi "+sql);
            }

       }
      
}
Anime

Oi,

Coloque assim no while…

while (igual.equalsIgnoreCase("n"))
iogui

Bem colega, não entendi bem o seu posicionamento, mas segue o código da conexao.
mesmo assim muito obrigado. (…)

José, por favor, volte a reler as dicas que postei aí com cuidado e atenção.
O código da classe Conexao está cheio de armadilhas e más práticas. Por exemplo:
Colocar os objetos statement e resultset como atributos públicos e permitir acesso indiscriminado a eles:

public Statement statement;  
public ResultSet resultset;

Isto é praticamente uma heresia de acordo com as boas práticas de programação java.

Outra coisa, você está executando isto:

resultset = statement.executeQuery(sql);

Se a query (variavel sql) possui parâmetros, você está montando a string com concatenação. Isto é muito mal.
Ao invés disto, crie um PreparedStatement como segue:

PreparedStatement pstatement = conexao.prepareStatement(sql);

Depois, imaginando uma query simples, não faça isto:

String sql = "select * from tabela where id= " + variavel;

Ao contrário, faça isto:

String sql = "select * from tabela where id = ?"

E depois com o PrepareStatement, faça o bind:

pstatement.setLong(1, varivel);

Aí é só executar a query:

resultset  = pstatement.execute();

Mais uma coisa, cuidado para não manter recursos abertos e perdidos (resultset, statement, conexão). Faça uso do método close.
Veja exemplos neste link:
http://javafree.uol.com.br/topic-1183-JDBC-Uso-de-Statement-e-ResultQuery.html

Espero que isto lhe ajude a se situar melhor.

[]s

Anime

Oi,

Achei melhor não comentar,mas o iogui comentou,só me resta concordar…Você deve ser iniciante e eu tenho quase certesa de onde vc tirou seu código,tb já cai nessas aulas,mas deixa pra lá…

Da uma olhadinha nesse material,vai ajuda-lo…http://rapidshare.com/files/447613019/jdbc.odp

Obs:Abre com OpenOffice.

jose_antonio_fernand

Oi, pois é cara, voce tem toda razão, sou estudante de Analise e Desenvolvimento de Sistema do 2º periodo e iniciante em java(faz menos de um ano que estou estudando java), apesar de ter noções de C++ e HTML, e acredite, estou quebrando muito a cabeça para fazer um sistema em java para armazenar os dados da membrazia de uma igreja. Faz aproximadamente 8 semanas que durmo depois da 3:00 hs da manhã fazendo pesquisa e tentado resolver alguns erro que surgem, acretite já evolui muito, mas não vou desistir, mesmo assim irmão muito obrigado pela comprensão e vontade de me ajudar, valeu até a próxima.

jose_antonio_fernand

Uma coisa que não consigo entender; tudo bem tem alguns erro de sitaxe, isso é inevitável, principalmente para iniciante. Como é que consigo acessar os dados inseridos no banco através de um JTextField(c_codigo) digtando no máximo três algarimos, e não consigo acessar usando 4 algarismo.
Se digito 854, tenho todos os dados do membro como, nome, data de nascimento, batismo…etc.
Agora se digito 12 me aparece os dados do membros 1204, que é o primeiro na seguência que começa com 12.
Se digito 1204 deveria aparecer os dados deste membro, que foi acessado digitando 12, mas tenho com resposta uma mensagem de erro:
(erro na consulta java.lang.StringIndexOutBoundsException: String index ouit of range:4),
Ajude- me por favor a entender isso.

Anime

Fez o que eu disse no while?
c_codigo é que tipo de dado no banco?

jose_antonio_fernand

Sim colega, fiz conforme o código abaixo.]
Respondendo a sua pergunta C-codigo é do tipo character varying no banco postgresql

view plaincopy to clipboardprint?
  
while (igual.equalsIgnoreCase("n"))

character varying

J

A exception lançada é bem sugestiva, ela está dizendo que a String passada está fora do intervalo mostrado!
Tente utilizar um depurador para saber exatamente onde o seu código está dando o erro.

Anime
jose_antonio fernando:
Sim colega, fiz conforme o código abaixo.] Respondendo a sua pergunta C-codigo é do tipo character varying no banco postgresql
view plaincopy to clipboardprint?
  
while (igual.equalsIgnoreCase("n"))

character varying

view plaincopy to clipboardprint? //tire essa linha por favor...e teste novamente
        
   while (igual.equalsIgnoreCase("n"))
jose_antonio_fernand

colega esta linha não está np código, mesmo assim ja copilei e o erro permaneçe.

Anime

joyle:
A exception lançada é bem sugestiva, ela está dizendo que a String passada está fora do intervalo mostrado!
Tente utilizar um depurador para saber exatamente onde o seu código está dando o erro.

Exatamente,

Pode imprimir o StackTrace…

catch(SQLException erro) {  
     JOptionPane.showMessageDialog(null,"Erro,ao listar");  
     erro.printStackTrace(); //isso vai imprimir a pilha de exceções no console, indicando, dentre outras informacoes, a linha que deu problema.  
 }
Anime

rsrs…que bom…que a linha não esta lá… :stuck_out_tongue:

Pose ser algum campo no banco que esta em branco(sem registro)… :roll:

Melhor imprimir o StackTrace… :wink:

Anime

Acho que tem que ser assim…

while(igual.equals("n")){ 
 
      if( obj_conexao.resultset.getString("c_codigo").equals(jf_codigo.getText())) {  
                
       igual = "s";  
      }
iogui

Se me permite uma sugestão. Use a estratégia de dividir para conquistar.
Principalmente considerando que você é um iniciante, o erro pode estar vindo de qualquer lado e as vezes de vários pontos. Portanto diminua o escopo.
Por exemplo, crie um projeto novo só com a parte problemática do código e sem usar swing.
Printando tudo na tela com System.out.println().
Aí vá mexendo aos poucos.
Nunca esqueça de printar a stacktrace em todo e qualquer bloco catch pra não correr o risco de mascarar algum erro.
As exceptions na stack trace costumam ser muito informativas apontando para a linha exata do programa onde o erro ocorre em cada trexo da pilha de exceções. Use isto a seu favor para ir analisando o que está acontecendo.
Tendo resolvido o problema, volte para o programa original e aplique as correções.

[]s

jose_antonio_fernand
Bom dia Ana Claudia, segue a mensagem de erro

java.lang.StringIndexOutOfBoundsException: String index out of range: 4

at java.lang.String.substring(String.java:1935)

at aplicaca.Cadastro.consultar(Cadastro.java:500)

at aplicaca.Cadastro.actionPerformed(Cadastro.java:412)

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:6041)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)

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

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

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

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

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

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

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

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

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

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

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

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

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

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

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

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

java.lang.StringIndexOutOfBoundsException: String index out of range: 4

at java.lang.String.substring(String.java:1935)

at aplicaca.Cadastro.consultar(Cadastro.java:500)

at aplicaca.Cadastro.actionPerformed(Cadastro.java:412)

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:6041)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)

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

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

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

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

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

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

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

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

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

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

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

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

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

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

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

at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
jose_antonio_fernand

Bom dia Ana Claudia voçê resolveu o meu problema com a linha de código

while(igual.equals("n"))
{   
  
if( obj_conexao.resultset.getString("c_codigo").equals(jf_codigo.getText())) 
{                  
igual = "s";     
}
Olha agora digito qualquer numero e o retorno é os dados do respectivo membro

1258 = 1258;

1204 = 1204;

Valeu colega, muito obrigado tchau
Anime

jose_antonio fernando:
Bom dia Ana Claudia voçê resolveu o meu problema com a linha de código

while(igual.equals("n"))
{   
  
if( obj_conexao.resultset.getString("c_codigo").equals(jf_codigo.getText())) 
{                  
igual = "s";     
}
Olha agora digito qualquer numero e o retorno é os dados do respectivo membro

1258 = 1258;

1204 = 1204;

Valeu colega, muito obrigado tchau</blockquote>

Por nada… :stuck_out_tongue:

Mas depois da uma olhada no material que indiquei,é a forma correta de programar…ok… :wink:

[],s

Criado 12 de fevereiro de 2011
Ultima resposta 13 de fev. de 2011
Respostas 19
Participantes 4