Pesquisa em banco postgresql

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.

[code]
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);
    }       
}
                   [/code]

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

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

[code]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);
        }

   }

}[/code]

Oi,

Coloque assim no while…


while (igual.equalsIgnoreCase("n"))

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

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

1 curtida

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.

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.

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.

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

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

[code]view plaincopy to clipboardprint?

while (igual.equalsIgnoreCase(“n”))
[/code]

character varying

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.

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

[code]view plaincopy to clipboardprint?

while (igual.equalsIgnoreCase(“n”))
[/code]

character varying[/quote]




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

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

[quote=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.[/quote]

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.  
 }

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:

Acho que tem que ser assim…


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

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

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)

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…

[quote=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…
[/quote]

Por nada… :stuck_out_tongue:

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

[],s