Erro quando existir apenas um Registro na consulta

5 respostas
E

Bom dia Amigos.
Estou fazendo uma consulta e exibindo os dados no formulário mas se o resultado da consulta for apenas um registro e eu tentar navegar para o anterior ele da a seguinte mensagem:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Estado de cursor inválido

Não queria que isso ocorresse, como posso fazer para parar com este erro?

Obrigado.

5 Respostas

B

Ola,

Vc poderia postar como vc esta navegando no resultado?

Ps: verifique se vc esta dando um next no resultSet antes de usa-lo.

E

Função do botão ANTERIOR

private void btAnteriorActionPerformed(java.awt.event.ActionEvent evt) {                                           
        try {
            TabelaDespesaViagem.resultset.previous();
            {
                mostradados();
                //navega = 1;
            }
        } catch (SQLException erro) {
        //JOptionPane.showMessageDialog(null, "Não foi possível ir para o registro anterior!"+erro);
        }
        exibeBotoes();
}

Função MOSTRA DADOS

public void mostradados() {
        try {
            //auxiliar data
            String data = TabelaDespesaViagem.resultset.getString("DataMov").replace("-", "");
            data = data.substring(6, 8) + data.substring(4, 6) + data.substring(0, 4);
            //alterei aqui



            txtCodigoMovimento.setText(TabelaDespesaViagem.resultset.getString("Codigo"));

            //dtTeste.setDate(TabelaDespesaViagem.resultset.getString("DataMov"));

            FtxtData.setText(data);//alterei aqui
            //Calendar selectedDate = chooser.getSelectedDate();
            //DTTESTE.setDate(TabelaDespesaViagem.resultset.getDate("DataMov"));
            //DTTESTE.set

            cbSaida.setSelectedItem(TabelaDespesaViagem.resultset.getString("Saida"));
            cbEntrada.setSelectedItem(TabelaDespesaViagem.resultset.getString("Entrada"));
            FtxtCodigo.setText(TabelaDespesaViagem.resultset.getString("Cliente"));
            FtxtNome.setText(TabelaDespesaViagem.resultset.getString("NmCliente"));
            FtxtBairro.setText(TabelaDespesaViagem.resultset.getString("Bairro"));
            FtxtCidade.setText(TabelaDespesaViagem.resultset.getString("Cidade"));
            cbTipoAtendimento.setSelectedItem(TabelaDespesaViagem.resultset.getString("Tipo"));
            cbTransporte.setSelectedItem(TabelaDespesaViagem.resultset.getString("Transporte")); 
            
            BigDecimal BDecimalVU = new BigDecimal(TabelaDespesaViagem.resultset.getString("VlUnitario"));
            BDecimalVU = BDecimalVU.setScale(2, BigDecimal.ROUND_HALF_EVEN);            
            FtxtVlUnitario.setValue(BDecimalVU.toString().replace(".", ","));
            
            BigDecimal BDecimalQD = new BigDecimal(TabelaDespesaViagem.resultset.getString("Qde"));
            BDecimalQD= BDecimalQD.setScale(2, BigDecimal.ROUND_HALF_EVEN);            
            FtxtQde.setValue(BDecimalQD.toString().replace(".", ","));            
            

            BigDecimal BDecimalVT = new BigDecimal(TabelaDespesaViagem.resultset.getString("VlTotal"));
            BDecimalVT= BDecimalVT.setScale(2, BigDecimal.ROUND_HALF_EVEN);            
            FtxtVlTotal.setValue(BDecimalVT.toString().replace(".", ","));
            
            cbSistema.setSelectedItem(TabelaDespesaViagem.resultset.getString("Sistema"));

            DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        //System.out.println (df.format (new java.util.Date())); 

        } catch (SQLException erro) {
            JOptionPane.showMessageDialog(null, "Este erro abaixo surge quando é chamado a função MostraDados:\n" + erro);
            //System.out.println(erro);
        }
        exibeBotoes();
    }

Função EXIBE BOTOES

public void exibeBotoes() {

        // Adiciona os ícones aos botões, exceto ao botão editar/cancelar
        // que recebe seu ícone no switch abaixo
        ImageIcon IcCancelar = new ImageIcon("./images/cancelar2.gif");
        ImageIcon IcEditar = new ImageIcon("./images/editar.gif");
        ImageIcon IcSalvar = new ImageIcon("./images/salvar.gif");
        ImageIcon IcExcluir = new ImageIcon("./images/excluir.gif");
        ImageIcon IcNovo = new ImageIcon("./images/novo.gif");
        ImageIcon IcPrimeiro = new ImageIcon("./images/primeiro_registro.gif");
        ImageIcon IcUltimo = new ImageIcon("./images/ultimo_registro.gif");
        ImageIcon IcAnterior = new ImageIcon("./images/registro_anterior.gif");
        ImageIcon IcProximo = new ImageIcon("./images/proximo_registro.gif");
        btNovo.setIcon(IcNovo);
        btExcluir.setIcon(IcExcluir);
        btSalvar.setIcon(IcSalvar);

        btAnterior.setIcon(IcAnterior);
        btProximo.setIcon(IcProximo);
        btPrimeiro.setIcon(IcPrimeiro);
        btUltimo.setIcon(IcUltimo);

        switch (situacaoEdicao) {
            case 0:
                btSalvar.setEnabled(false);
                btNovo.setEnabled(true);
                btExcluir.setEnabled(true);
                try {
                    if (TabelaDespesaViagem.resultset.isLast()) {
                        btPrimeiro.setEnabled(true);
                        btAnterior.setEnabled(true);
                        btProximo.setEnabled(false);
                        btUltimo.setEnabled(false);
                    } else if (TabelaDespesaViagem.resultset.isFirst()) {
                        btPrimeiro.setEnabled(false);
                        btAnterior.setEnabled(false);
                        btProximo.setEnabled(true);
                        btUltimo.setEnabled(true);
                    } else {
                        btPrimeiro.setEnabled(true);
                        btAnterior.setEnabled(true);
                        btProximo.setEnabled(true);
                        btUltimo.setEnabled(true);
                    }
                } catch (SQLException ex) {
                    Logger.getLogger(Movimentos.class.getName()).log(Level.SEVERE, null, ex);
                }


                btEditar.setToolTipText("Edita um registro existente.");
                btEditar.setText("Editar");
                btEditar.setIcon(IcEditar);

                FtxtCodigo.setEditable(false);
                FtxtNome.setEditable(false);
                FtxtCidade.setEditable(false);
                FtxtCidade.setEditable(false);
                FtxtData.setEditable(false);
                break;
            case 1:
            case 2:
                btSalvar.setEnabled(true);
                btNovo.setEnabled(false);
                btExcluir.setEnabled(false);
                btPrimeiro.setEnabled(false);
                btProximo.setEnabled(false);
                btAnterior.setEnabled(false);
                btUltimo.setEnabled(false);

                btEditar.setToolTipText("Cancelar operação.");
                btEditar.setText("Cancelar");
                btEditar.setIcon(IcCancelar);

                FtxtCodigo.setEditable(true);
                FtxtNome.setEditable(true);
                FtxtCidade.setEditable(true);
                FtxtCidade.setEditable(true);
                FtxtData.setEditable(true);
                break;
            }

    }

Segue como solicitado.

B

Ola,

Bom, vamos lá:
Vc sabia que não é nada legal mandar uma conexão com o banco assim carregada?
que quando vc executa uma query o banco monta uma tabela resposta e a guarda em
memoria? e que quanto mais cedo vc liberar este espaço melhor?

Então, faça o seguinte, crie uma classe bean para representar o que vc esta consultando…
Quando executar a consulta, crie e armazene num list da vida instancias desta classe, e
feche o resultser, statement… na hora de navegar, pegue deste list a instancia
correspondente ao index e mostre-o…

Saca?

E

Brunão…
To aprendendo agora.
Se desejar eu te mando este projeto compactado para seu e-mail e vc comenta suas alterações, pode ser?
Preciso de ajuda, este projeto é meramente de treinamento, nada oficial.
Foi feito em Net Beans 6.0

Estou aprendendo java sozinho.
Conto apenas com vcs.

Abraço.

B

Ola,

BOm, é tranquilo, o que disse é o seguinte:
Usar o padrão bean, que basicamente é vc fazer uma classe que representa algo… tipo um carro, por exemplo:

Todo bean tem atributos que podem qualificar a instancia.

public class Carro{ private String modelo; private int anoFabricacao; private String cor; ...
E para todo atributo vc tem os metodos de acesso, famosos getters e setters,

public class Carro{
  ...

  public String getModelo(){
    return modelo;
  }

  public void setModelo(String modelo){
    this.modelo = modelo;
  }
 ...

Saca?

Dica: no netbeans vc pode ir em refatorar->Encapsular Campos… após declarar os atributos,
que ele gera os getters e setters pra vc… pois vc verá que escrever estes metodos é um pé no s&*¨%aco

1-> O que disse foi, cria um bean para representar o que vc consultou.
2-> Depois de vc executar a query, crie instancias desta classe e armazene num list da vida.

Ex.:

ResultSet rs = ....//selecionou uns carros pra gente :)
ArrayList<Carro> carros = new ArrayList<Carro>();
while(rs.next()){
  Carro carro = new Carro();
  carro.setMopdelo(rs.getString("modelo"));
  ...//e vai populando o objeto
  carros.add(carro);
}
rs.close();

Pronto… dae na sua interface vc só nevega no arrayList de carros.

Pra vc dar uma olhada na API do arrayList, clique aqui

Criado 6 de março de 2008
Ultima resposta 6 de mar. de 2008
Respostas 5
Participantes 2