Transferir os dados de um ResultSet para String[][]

10 respostas
pro_websis

Boa tarde pessoal, bom preciso de ajuda para listar os dados em uma JTable

tipo criei uma função que faz uma busca e tem como retorno uma string,

para depois jogar os dados numa tabela, o problema é que eu não estou conseguindo retornar os dados do resultset num String que seria as linhas da tabela

public String[][] buscaAll(String query) throws SQLException{
                           
            command = connection.createStatement();           
            String[][] dados = null;            
            int linha=0 ;            
           
            try{                   
                rs = command.executeQuery(query);
            }catch (SQLException sqlex){

                System.out.println("erro sql ");
                sqlex.printStackTrace();                       
            }

            
	    int registro = 0;	
            while (rs.next()){
                    try{
                            ResultSetMetaData rsmd = rs.getMetaData();
                            
                            
                            // aqui faço as atribuições das colunas 
                            // para linha, e é aqui que tah dando erro.
                            dados[linha][0] = rs.getString(1);
                            dados[linha][1] = rs.getString(2);
                            dados[linha][2] = rs.getString(3);
                            dados[linha][3] = rs.getString(4);
                            
                            linha++;
                           
                           // Teste para listar os dados OK.
                            System.out.println("\n("+ ++registro +")----------");
                            System.out.println(rsmd.getColumnName(1)+"..:"+ rs.getString(1));
                            System.out.println(rsmd.getColumnName(2)+":"+ rs.getString(2));
                            
                    }
                    catch (SQLException sqlex){
                            sqlex.printStackTrace();
                    }
            }
                
            command.close();   

            return dados;
	}

o erro é o seguinte Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 0

eu acho q não estou atribuindo os valores corretamente para a estring será que o problema é na declaração do array dados?

ou tem uma forma mais fámcil de jogar os dados de um Resultset para um JTable?

Aguardo respostas
abs.

10 Respostas

rmendes08

É bem simples, você simplesmente declara a referência para a matriz de Strings, mas não cria ela efetivamente. O que você tem que fazer é chamar o operador new antes de começar a usar a matriz:

String [][] matriz = new String[10][5]; //10 linhas e 5 colunas, por exemplo
rmendes08

Sugestão: coloque todo o código em um único bloco try-catch, seu código ficará mais simples de se ler.

pro_websis

Poxa mendes valeu mesmo pela ajuda deu certo mais soh tenho mais uma coisinha

// aqui como eu posso colocar a quantidade total de linhas de um resultset 
// no lugar do 80, pra matriz ser do tamanho das linhas que foram retornadas do banco?
// pq do banco esta retornando 2 resultados ai fica um monte de linha em branco
String[][] dados = new String[80][4];
francislon

http://www.guj.com.br/posts/list/44053.java

rmendes08
pro_websis:
Poxa mendes valeu mesmo pela ajuda deu certo mais soh tenho mais uma coisinha
// aqui como eu posso colocar a quantidade total de linhas de um resultset 
// no lugar do 80, pra matriz ser do tamanho das linhas que foram retornadas do banco?
// pq do banco esta retornando 2 resultados ai fica um monte de linha em branco
String[][] dados = new String[80][4];

Wise question grasschopper!

Sabia que você ia perguntar isso! Existe um pequeno problema nessa abordagem. A interface do ResultSet não fornece o número de linhas do resultado da consulta. No entanto, você poderia calcular esse número com um loop e contando o número de linhas. Após contar, você cria a matriz, chama ResultSet.first() e repete o laço, desta vez lendo os resultados. Particularmente, eu acho essa solução péssima.

A segunda abordagem, que é mais correta e mais simples, é usar um ArrayList para as linhas do result set. Assim::

List<String[]> listaDeArray = new ArrayList<String[]>();

   while( rset.next() ){
       listaDeArray.add( new String[]{ rset.getString(1) , rset.getString(2) , rset.getString(3) , rset.getString(4) } );
   }

Se você realmente precisa retornar estes dados como uma matriz, basta chamar o métod toArray:

listaDeArray.toArray();
pro_websis

Então brother pelo menos no codigo o arrayList não tah indicando erro algum mais ainda tah dando um erro q não sei o q é

essa é a função que retorna a matriz

public String[][] buscaAll(String query) throws SQLException{
                           
            command = connection.createStatement();                       
            
            try{                   
                rs = command.executeQuery(query);
            }catch (SQLException sqlex){

                System.out.println("erro sql ");
                sqlex.printStackTrace();                       
            }
            
            System.out.println("tamanho do array: "+rs.getRow());
            
            List<String[]> listaDeArray = new ArrayList<String[]>();  

            while (rs.next()){
                    try{
                         
                            listaDeArray.add( new String[]{ rs.getString(1) , rs.getString(2) , rs.getString(3) , rs.getString(4) } );                              
                            
                    }catch (SQLException sqlex){
                            sqlex.printStackTrace();
                    }
            }
                
            command.close();
            
            return (String[][]) listaDeArray.toArray();
	}

e aqui esta a chamada para o método

String[][] dados = null;
    String query = "select * from cadastro;";
    System.out.println(query);
    Banco b = new Banco("sis1");
        try {
           dados = b.buscaAll(query);
        } catch (SQLException ex) {
            Logger.getLogger(ConsultaCliente.class.getName()).log(Level.SEVERE, null, ex);
        }    
    
    
    String[] colunas = new String[]{"Nome", "Endereço", "Telefone", "Email"};  
    
    //Manipulando o modelo da Tabela  
    final DefaultTableModel modelo = new DefaultTableModel(dados,colunas);
    
    tabelaCliente.setModel(modelo);

esse é o erro Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [[Ljava.lang.String;

rmendes08

Me desculpe amigo, o final do post ficou errado. Você precisa usar uma versão sobrecarregada do método toArray():

lista.toArray( new String[0][0] );

Dessa maneira o método retorna um array com o tipo correto de elemento. A versão anterior retornava um array de object, por isso o ClassCastException.

V

Não seria mais fácil você passar os dados atravéz do Model da tabela não??

Vai um exemplo

private ResultSet rs;
private DefaultTableModel model;

//construtor
public MinhaClasse()
{
         model = (DefaultTableModel)table.getModel();
}

Agora dentro do botão você coloca esse código aqui:

.
.
.
.
while(rs.next())
                {
                    model.addRow(new Object[]{
                    rs.getInt("Campo2"),   //nome do seu campo no banco de dados
                    rs.getString("Campo1")
                    });
        		}

Não sei se é isso que você procura, mas de qualquer forma está aí!

Jesuino_Master

Vou dar uma dica que uso. Eu conto as linha percorrendo o RS antes, sem nenhuma operação… Não uso isso em aplicativos mais sérios, pois sei da implicação com performance quando temos muitas linhas…

//Declaro a string
String dados[][];
//um contador de linhas
int cont = 0;

//percorro o rs somente para contagem das linhas
while(rs.next()) cont++;

//Gero minha string, agora sim

dados = new String[cont][NUM_COLUNAS];

//busco os dados novamente ( existe o método rs.beforeFirst(), para voltar na linha certa, mas comigo não tem funcionado bem em todos os banco...)
rs = comando.executeQuery(meuSelect)

//agora faço o loop para conseguir os dados e jogar na String...

Bem, não sei se isso ajudará, mas fica ai a sugestão… Estou a disposição!

pro_websis

Valeu pessoal deu certo :slight_smile:
abs a todos.

Criado 21 de fevereiro de 2009
Ultima resposta 24 de fev. de 2009
Respostas 10
Participantes 5