navegação entre objetos

8 respostas
J
boa tarde estou com problema nos metodos primeiroRegistro(), anteriorRegistro() proximoRegistro(), ultimoRegistro(). nao funciona direito.
while (rs.next())
// o proximoRegistro() vai pro ultimo registro
while (rs.previous())
//o anteriorRegistro() nem funciona
while (rs.first())
//o primeiroRegistro() funciona mais trava o sistema por uns 3 minustos
while (rs.last())
//o ultimoRegistro() funciona mais trava o sistema por uns 3 minustos

alguem me ajude por favor so falta isso pro meu sistema funcionar...

private void proximoRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD
        try {
            String sql = "SELECT * FROM aluno";
            Statement stm = connection.createStatement();

            try {
                ResultSet rs = stm.executeQuery(sql);
                while (rs.next())
                {
                    Date DataNasc = rs.getDate("DataNasc");
                    SimpleDateFormat maskData = new SimpleDateFormat("dd/MM/yyyy");
                    String nascimento = maskData.format(DataNasc);

                    txfNumMatricula.setText(rs.getString("codigo"));
                    txfNomeAluno.setText(rs.getString("nome"));
                    txfEndereco.setText(rs.getString("endereco"));
                    txfCidade.setText(rs.getString("cidade"));
                    cbxUf.setSelectedItem(rs.getString("Uf"));
                    txfValorMensal.setText(rs.getString("ValorMensal"));
                    txfDataNasc.setText(nascimento);
                }
            } catch (Exception e2) {
                System.out.println("\nErro no resultset!");
            }
        } catch (Exception e2) {
            System.out.println("\nErro no statement!");
        }                       
    }

8 Respostas

BrunoBastosPJ

Vou fazer o primeiro método e depois veja se consegue fazer os outros!

public boolean proximoRegistro(ResultSet rs) {
  return rs.next();
}
J

Boa noite BrunoBastosPJ
nao deu certo tentei implementar o metodo que vc me passou mais nao deu certo

J

Bom dia Continuo com aquele problema que eu havia citado
so que eu resouvi o erro do

rs.first();
rs.last();

so que o erro continua no

rs.next();

rs.previous();

ResultSet rs = stm.executeQuery(sql); rs.next();

alguem poderia me ajudar

InSeOfKn

JOCIMA:
Bom dia Continuo com aquele problema que eu havia citado
so que eu resouvi o erro do

rs.first();
rs.last();

so que o erro continua no

rs.next();

rs.previous();

ResultSet rs = stm.executeQuery(sql); rs.nextt();

alguem poderia me ajudar

cuidado! você esta usando nex[b]tt/b em vez de nex[b]t/b

só o que pude reparar não entendo nada de BD

até!

discorpio

Boa noite a todos.

O Erro persiste porque voce criou um “Statement” que carrega um “ResultSet Unidirecional” (Forward Only), ou seja, os registros só navegam para frente uma única vez, e por isso os métodos rs.first() e rs.previous() não funcionam, porque não podem voltar atrás.

Para carregar um “ResultSet Bidirecional”, ou seja, que vá para adiante e regresse ao primeiro ou anterior, voce deve escrever o seu “Statement” dessa maneira:

............  
            Statement stm = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 
            ..............

As opções são:

Um abraço.

J
discorpio:
Boa noite a todos.

O Erro persiste porque voce criou um "Statement" que carrega um "ResultSet Unidirecional" (Forward Only), ou seja, os registros só navegam para frente uma única vez, e por isso os métodos rs.first() e rs.previous() não funcionam, porque não podem voltar atrás.

Para carregar um "ResultSet Bidirecional", ou seja, que vá para adiante e regresse ao primeiro ou anterior, voce deve escrever o seu "Statement" dessa maneira:

............  
            Statement stm = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 
            ..............

As opções são:

para o primeiro parâmetro:

TYPE_FORWARD_ONLY: Esta navegação é somente adiante e é configurada como default, em caso de não ser fornecido os parâmetros.
TYPE_SCROLL_SENSITIVE: Navegação para ambos os lados, as alterações na tabela em tempo de execução são refletidas.
TYPE_SCROLL_INSENSITIVE: Similar a segunda opção, a diferença é que as alterações na tabela em tempo de execução, neste caso não são refletidas, por isso, a segunda opção é a mais adequada.

para o segundo parâmetro:
CONCUR_READ_ONLY: ResultSet somente de Leitura.
CONCUR_UPDATABLE: ResultSet que pode ser atualizado.

Um abraço.

"Boa noite discorpio eu tentei implementar o que vc me passou mas nao deu certo veja so ah o codigo ta diferente pois eu passeu parte para um metodo
//Este metodo esta funcionando perfeitamente
    private void primeiroRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD
        try {
            statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            resultSet = statement.executeQuery(select);
            resultSet.first();
            carregaDados();
        } catch (Exception e2) {
            System.out.println("ERRO: "+e2.getMessage());
        }                        
    }
//Este metodo nao esta funcionando
    private void anteriorRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD
        try {
            statement= connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            resultSet = statement.executeQuery(select);
            resultSet.previous();
            carregaDados();                            //METODO COM OS DADOS A SEREM CARREGADOS
        } catch (Exception e2) {
            System.out.println("ERRO: "+e2.getMessage());
        }                        
    }
//Este metodo nao esta funcionando
    private void proximoRegistro() {                //METODO QUE CARREGA O PROXIMO REGISTRO DO EM RELACAO A QUAL SE ESTA NO BD
        try {
            statement= connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            resultSet = statement.executeQuery(select);
            resultSet.next();
            carregaDados();                            //METODO COM OS DADOS A SEREM CARREGADOS
        } catch (Exception e2) {
            System.out.println("ERRO: "+e2.getMessage());
        }                    
    }

//Este metodo esta funcionando perfeitamente
    private void ultimoRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD
        try {
            statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            resultSet = statement.executeQuery(select);
            resultSet.last();
            carregaDados();
        } catch (Exception e2) {
            System.out.println("ERRO: "+e2.getMessage());
        }                        
    }
"
discorpio

Boa noite Jocima.

Realmente, não vai funcionar os métodos “Previous e Next”, voce sabe por que :?: :?: :?:

Simplesmente porque voce está dando refresh na tabela quando invoca os quatro métodos. :shock:

Ou seja, como voce espera navegar num ResultSet, onde voce o limpa, depois recarrega-o com instruções SQL a toda hora. :cry:

Todo ResultSet, assim como DataSets (Delphi) ou RecordSets (VB) , tem dois ponteiros de registros sem a estrutura da tabela, apenas para indicar “Inicio de arquivo (BOF - Begin of File)” e o “Fim de Arquivo (EOF - End of File)” e por isso, dentro do Java (ResultSet), existem métodos que também posicionam nestes ponteiros que são:

Mas o por que, Discorpio, voce está me passando estes conceitos :?:

Não só para ampliar seus conhecimentos, mas como também para inforamar a voce, que quando voce apanha registros da tabela com instruções SQL, o ResultSet é carregado com o ponteiro do registro posicionado em BOF.

Agora vamos ver onde voce está errando:

//Este metodo esta funcionando perfeitamente   
    private void primeiroRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD   
        try {   
            statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

            // Aqui voce limpa e recarrega o ResultSet e posiciona o ponteiro em BOF
            resultSet = statement.executeQuery(select);
 
            // Aqui voce vai para o primeiro registro após o BOF  
            resultSet.first(); 
  
            carregaDados();   
        } catch (Exception e2) {   
            System.out.println("ERRO: "+e2.getMessage());   
        }                           
    }
    // Bom, até aqui a sua lógica tá funcionado

    //Este metodo nao esta funcionando   
    private void anteriorRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD   
        try {   
            statement= connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 

            // Aqui voce limpa e recarrega o ResultSet e posiciona o ponteiro em BOF
            resultSet = statement.executeQuery(select);

            // Aqui voce não vai para lugar nenhum porque não existe registro além de BOF.
            resultSet.previous();
   
            carregaDados();                            //METODO COM OS DADOS A SEREM CARREGADOS   
        } catch (Exception e2) {   
            System.out.println("ERRO: "+e2.getMessage());   
        }                           
    }

    //Este metodo nao esta funcionando   
    private void proximoRegistro() {                //METODO QUE CARREGA O PROXIMO REGISTRO DO EM RELACAO A QUAL SE ESTA NO BD   
        try {   
            statement= connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
   
            // Aqui voce limpa e recarrega o ResultSet e posiciona o ponteiro em BOF
            resultSet = statement.executeQuery(select);
            
            /* Aqui pelo menos voce consegue chegar ao primeiro registro
                porém nunca voce conseguir sair dele porque a instrução 
                anterior limpa e recarrega o ResultSet e novamente posiciona
                em BOF.  */
            resultSet.next();
   
            carregaDados();                            //METODO COM OS DADOS A SEREM CARREGADOS   
        } catch (Exception e2) {   
            System.out.println("ERRO: "+e2.getMessage());   
        }                       
    }   
   
    //Este metodo esta funcionando perfeitamente   
    private void ultimoRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD   
        try {   
            statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

            // Aqui voce limpa e recarrega o ResultSet e posiciona o ponteiro em BOF
            resultSet = statement.executeQuery(select);
 
            // Aqui voce consegue ir para o último registro.
            resultSet.last();   
            carregaDados();   
        } catch (Exception e2) {   
            System.out.println("ERRO: "+e2.getMessage());   
        }                           
    }

Outra dica que te dou é que eu simplesmente acho desnecessário todos esses métodos que voce implementou, só para navegar no ResultSet, quando voce pode utilizá-los diretamente do ResultSet, ou seja, se voce quiser implementar Eventos de componentes, para que criar um método intermediário de navegação de ResultSet, se voce pode invocar ResultSet.first(), …last(), …previous() e …next() diretamente dele :?:

Eu particulamente acho que voce está fazendo redundância, que é o que costumamos chamar no meu trabalho de “Disperdício de Recursos”.

Faça a conexão com o banco de dados apenas uma única vez, e na hora de requisitar os dados da tabela, também o faça, alimentando o ResultSet uma vez, para depois navegar nele, sem ir novamente a tabela no momento da navegação. Apenas requisite novos dados através de SQL, quando for necessário a pesquisa de novos critérios de filtros em registros.

J
RESOLVIDO
//     //esse codigo deve ficar junto da conexao
	statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
	resultSet = statement.executeQuery(select);
private void primeiroRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD
        try {
            resultSet.first();
            carregaDados();
        } catch (Exception e2) {
            System.out.println("ERRO: "+e2.getMessage());
        }                        
    }

    private void anteriorRegistro() throws SQLException {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD
        try {
            resultSet.previous();
            carregaDados();
        } catch (Exception e2) {
            if(txfNumMatricula.getText().equals(resultSet.first())){
            }
        }                        
    }

    private void proximoRegistro() throws SQLException {                //METODO QUE CARREGA O PROXIMO REGISTRO DO EM RELACAO A QUAL SE ESTA NO BD
        try {
            resultSet.next();
            carregaDados();        
        } catch (Exception e2) {
            if(txfNumMatricula.getText().equals(resultSet.last())){
            }
        }    
    }

    private static void ultimoRegistro() {                //METODO QUE CARREGA O ULTIMO REGISTRO DO BD
        try {
            resultSet.last();
            carregaDados();
        } catch (Exception e2) {
            System.out.println("ERRO: "+e2.getMessage());
        }                        
    }
obrigado a todos que ajudaram
Criado 13 de outubro de 2010
Ultima resposta 22 de out. de 2010
Respostas 8
Participantes 4