Leitura de Registros

6 respostas
R

Estou com problema na leitura de uma SQL.
Tenho uma base access que contem + de 2000000 registros.
Estou executando o comando “SELECT DISTINCT COUNTRY FROM TABELA ORDER BY COUNTRY”.
este comando me traz apenas 5 paises, o que esta correto, mas se eu pedir ao resultset para me mostrar o total de linhas ele acusa os 2000000 e não apenas 5, e isto esta dando erro na leitura.
O comando .next() vai até o 5 registro com sucesso, mas ele diz que tem um 6, passa pelo .next(), mas da erro no .getString(“Country”).

Alguem pode me ajudar ??

Segue o código.

private void montaListaCountry()
{
    DefaultTableModel modelo = (DefaultTableModel) ListaCountry.getModel();
    modelo.setNumRows(0);

    try
    {
        rs.executeSQL("SELECT Distinct Country FROM LA_Weather_Data_Mun ORDER BY Country");

        while (rs.resultset.next())
            modelo.addRow(new Object[] {rs.resultset.getString("Country")});

    } catch(SQLException e)
    {
        JOptionPane.showMessageDialog(null, "Error in update of country's list.\nErro ["+e+"]");
    }
}

6 Respostas

D

Opa, boa tarde

Onde está este resultset que está no seu while (rs.resultset.next()) e o rs?
Coloque estes objetos dentro do seu método e faça um teste, pode ser que tenha alguma outra coisa usando o seu objeto de consulta.

Alguma coisa tem de errado no seu programa.

Abraço,
Daniel

R

Oi Daniel;

Este a classe de conexão com o BD.

package utilitarios;

import java.sql.;
import javax.swing.
;

public class Conexao

{

final private String driver = sun.jdbc.odbc.JdbcOdbcDriver;

final private String DBQ = DataBase\LA_Weather_Data.accdb;

final private String url = jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=+DBQ;

final private String usuario = “”;

final private String senha = “”;
public 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: "+Driver);
        result = false;
    } catch (SQLException Fonte)
    {
        JOptionPane.showMessageDialog(null,"Deu erro na conexão com a fonte de dados: "+ Fonte);
        result = false;
    }
    return result;
}

public void desconecta()
{
    boolean result = true;
    try
    {
        conexao.close();
//            JOptionPane.showMessageDialog(null,“Banco fechado.”);

} catch (SQLException erroSQL)

{

JOptionPane.showMessageDialog(null, "Não foi possível fechar o banco de dados: "+erroSQL.getMessage());

result = false;

}

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

}

Este é o formulario:

package Telas;

import java.sql.SQLException;

import javax.swing.JOptionPane;

import javax.swing.table.DefaultTableModel;

import utilitarios.*;

public class Filtros extends javax.swing.JFrame {

Conexao rs;

public Filtros() {
    initComponents();

    setLocationRelativeTo(null);

    rs = new Conexao();
    rs.conecta();

    montaListaCountry();
}

private void montaListaCountry()
{
    DefaultTableModel modelo = (DefaultTableModel) ListaCountry.getModel();
    modelo.setNumRows(0);

    try
    {
        rs.executeSQL("SELECT Distinct Country FROM LA_Weather_Data_Mun ORDER BY Country");

        while (rs.resultset.next())
            modelo.addRow(new Object[] {rs.resultset.getString("Country")});

    } catch(SQLException e)
    {
        JOptionPane.showMessageDialog(null, "Error in update of country's list.\nErro ["+e+"]");
    }
}

private void montaListaSubCountry()
{
    DefaultTableModel modelo = (DefaultTableModel) ListaSubCountry.getModel();
    modelo.setNumRows(0);

    try
    {
        rs.executeSQL("SELECT Distinct Sub_Country FROM LA_Weather_Data_Mun " +
                             "WHERE Country='" + ListaCountry.getValueAt(ListaCountry.getSelectedRow(), 0) + "' "+
                             "ORDER BY Sub_Country");

        while (rs.resultset.next())
            modelo.addRow(new Object[] {rs.resultset.getString("Sub_Country")});

    } catch(SQLException e)
    {
        JOptionPane.showMessageDialog(null, "Error in update of sub country's list.\nErro ["+e+"]");
   }
}

private void montaListaSubSubCountry()
{
    DefaultTableModel modelo = (DefaultTableModel) ListaSubSubCountry.getModel();
    modelo.setNumRows(0);

    try
    {
        rs.executeSQL("SELECT Distinct Sub_Sub_Country FROM LA_Weather_Data_Mun " +
                             "WHERE Country='" + ListaCountry.getValueAt(ListaCountry.getSelectedRow(), 0) + "' and "+
                             "Sub_Country='"+ListaSubCountry.getValueAt(ListaSubCountry.getSelectedRow(),0) + "' " +
                             "ORDER BY Sub_Sub_Country");

        while (rs.resultset.next())
            modelo.addRow(new Object[] {rs.resultset.getString("Sub_Sub_Country")});

    } catch(SQLException e)
    {
        JOptionPane.showMessageDialog(null, "Error in update of sub country's list.\nErro ["+e+"]");
   }
}

@SuppressWarnings("unchecked")

private void ListaCountryMouseClicked(java.awt.event.MouseEvent evt) {                                          
    montaListaSubCountry();
}                                         

private void ListaSubCountryMouseClicked(java.awt.event.MouseEvent evt) {                                             
    montaListaSubSubCountry();
}                                            

private void formWindowClosed(java.awt.event.WindowEvent evt) {                                  
    rs.desconecta();
}                                 

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Filtros().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton BtnAddCountry;
private javax.swing.JButton BtnAddSubCountry;
private javax.swing.JButton BtnAddSubSubCountry;
private javax.swing.JButton BtnRemoveCountry;
private javax.swing.JButton BtnRemoveSubCountry;
private javax.swing.JButton BtnRemoveSubSubCountry;
private javax.swing.JTable ListaCountry;
private javax.swing.JTable ListaCountryResult;
private javax.swing.JTable ListaSubCountry;
private javax.swing.JTable ListaSubCountryResult;
private javax.swing.JTable ListaSubSubCountry;
private javax.swing.JTable ListaSubSubCountryResult;
private javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane5;
private javax.swing.JScrollPane jScrollPane6;
// End of variables declaration

}

D

Bom dia rgomide, tudo certo?

Nas outras querys o problema também ocorre? Tente fazer uma consulta sem filtro em uma outra tabela para ver se o erro continua.
Uma dica que dou desde já, é que você sempre feche o Statement e o ResultSet em cada consulta feita.

Att,
Daniel

R

Bom dia Daniel;

Até o momento em todas as consultas esta dando o mesmo problema.

Eu já entrei na base access e mandei compactar, para ver se não era algum problema na base.
fiz uma query dentro do access, e funcionou perfeitamente.

PS: obrigado pela dica de fechar o resultset e o statemente. Já implementei.

tem alguma ideia o que pode estar acontecendo ?

Obrigado e abraço.

D

Opa, sim, é possível que tenha haver com o statement que você está criando, pode não ser suportado pelo seu banco.

Tente remover os modos de resultset deixando como abaixo:

conexao.createStatement();

ao invés de:

conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Outra coisa também que até esqueci de menciona, sempre que colar códigos no fórum, utilize a tag code, isto ajuda na visualização.

Att,
Daniel

R

Daniel;

Funcionou.

Foi só fazer a alteração que vc mensionou.

Muito Obrigado.

Abraço.

Criado 13 de dezembro de 2011
Ultima resposta 14 de dez. de 2011
Respostas 6
Participantes 2