Armazenar Consulta SQL em Array ?

Boa Tarde galera. Estou tentando armazenar o RS de uma string SQL dentro de um array com a quantidade de linhas de acordo com o ResultSet e as colunas defini manual, mas clico para depurar o cod ele não alimenta o array com os dados. pula direto para o catch (Exception e);

conecta.conexao();

try {
	conecta.executaSQL("select * from tbl_produtos")
	
	//DETERMINA TAMANHO DA MATRIZ DE ACORDO COM O RS
	int contaLista=0;
	String[][]lista=new String[contaLista][3];
	
	while(conecta.rs.next()) {
		contaLista++;
	}
	
	for(int cont=0;cont<contaLista;cont++) {
		lista[cont][1]=conecta.rs.getString("nom_produto");
		lista[cont][2]=conecta.rs.getString("descricao");
		lista[cont][3]=conecta.rs.getString("valor");
	}
	
	//EXIBE LISTA
	for(int i=0; i<lista.length;i++) {
		//COMO IMPRIMIR ESSE ARRAY?
	}   
	
	conecta.desconecta();
} catch (Exception e) {
	JOptionPane.showMessageDialog(null,"Erro !"+e);
}

Se está indo direto para o cath, poderia informar o que aparece na Exception e.
dá um System.out.println("Erro: "+e); e posta aqui o erro.

Consegui fazer aqui da seguinte maneira.

public class matriz {

Connection con;
PreparedStatement pst;
ResultSet rs;

public matriz(){
    try {
        con = conexao_postgres();
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(matriz.class.getName()).log(Level.SEVERE, null, ex);
    }
    int contaLista=0;
    
    String sql = "select nome, informacoes, empresa from principal";
    try {
        pst = con.prepareStatement(sql);
        rs = pst.executeQuery();
        //Carrega a matriz
        while(rs.next()){
            contaLista++;
        }
        String[][]lista=new String[contaLista][3];
        
        int con = 0;
        rs = pst.executeQuery();
        while(rs.next()){
            lista[con][0]=rs.getString("nome");
            lista[con][1]=rs.getString("informacoes");
            lista[con][2]=rs.getString("empresa");
            con++;
        }
        
        //Ler a matriz
        for(int i = 0; i<contaLista; i++){
            System.out.println("Lista Nº "+i);
            for(int y = 0; y<=2; y++){
                System.out.println(lista[i][y]);
            }
        }

    } catch (SQLException ex) {
        Logger.getLogger(matriz.class.getName()).log(Level.SEVERE, null, ex);
    }
}

O Começo está semelhante ao seu, onde ele pesquisa e conta quantos registro possui.
Acabei descobrindo o porque do seu dar erro.
int contaLista=0;
String[][]lista=new String[contaLista][3];
while(conecta.rs.next()){
contaLista++;
}
vc fez assim, mas n adianta fazer um contaLista++ se já foi setado String[][]lista=new String[contaLista][3]; anteriormente… pode observar no meu exemplo, que ele está depois.
Qualquer duvida por perguntar.

1 curtida

Bom Dia Marcos. obrigado pela ajuda. fiz da forma como disse e esta dando o seguinte erro: java.lang.arrayIndexOutOfBoundsException: 2

conecta.executaSQL("select * from tbl_produtos")
 int contaLista=0;
 try {       
            //DETERMINA TAMANHO DA MATRIZ DE ACORDO COM O RS         
            while(conectaIcms.rs.next()){              
                contaLista++;
            }
            String[][]lista=new String[contaLista][2];  
            int cont2=0;
            while(conectaIcms.rs.next()){
                lista[cont2][0]=conectaIcms.rs.getString("EMP_FIL");
                lista[cont2][1]=conectaIcms.rs.getString("EMP");
                cont2++;
            }            
            
            for(int i = 0; i<contaLista; i++){
                System.out.println("Lista Nº "+i);
                for(int y = 0; y<=lista.length; y++){
                    System.out.println(lista[i][y]);
                    }
            }
            
        conectaIcms.desconcta();       
                             
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Erro !"+e);
            }

for(int y = 0; y<=lista.length; y++){

Sabe que esse y, é para percorrer as colunas… se vc colocar lista.lenght, vai dar errado.
se vc possui , nom_produto, descricao e valor. deveria ser y<=2 pois ele verificaria 0,1,2 que são 3.
se for, emp_fil e emp, deveria ser y<=1, q ele verificaria 0 e 1, que são 2.

1 curtida

corrigido continua sem funcionar, quando crio uma variavel qualquer e armazeno um campo qualquer da tabela, essa variavel consegue armazenar normalmente, mas quando tento armazenar ela em um vetor fica dando erro, quando depuro o cod, ele entra no while quando vai armazer o primeiro valor ela pula direto pro catch

conecta.executaSQL(“select * from tbl_produtos”);

Repete isso antes da leitura.

mais ou menos assim.

> conecta.executaSQL("select * from tbl_produtos")
> int contaLista=0;
> try { 
> //DETERMINA TAMANHO DA MATRIZ DE ACORDO COM O RS 
> while(conectaIcms.rs.next()){ 
> contaLista++;
> }
> String[][]lista=new String[contaLista][2];
> int cont2=0;
> while(conectaIcms.rs.next()){
> lista[cont2][0]=conectaIcms.rs.getString("EMP_FIL");
> lista[cont2][1]=conectaIcms.rs.getString("EMP");
> cont2++;
> }
       conecta.executaSQL("select * from tbl_produtos");   //SEGUNDA EXECUCAO DA QUERY
>         for(int i = 0; i<contaLista; i++){
>             System.out.println("Lista Nº "+i);
>             for(int y = 0; y<=lista.length; y++){
>                 System.out.println(lista[i][y]);
>                 }
>         }

>     conectaIcms.desconcta();       

>         } catch (Exception e) {
>             JOptionPane.showMessageDialog(null,"Erro !"+e);
>         }

Pois quando você começa a leitura, seu Result Set já tá no fim, entao deveria resetar ele para começar do 0.

1 curtida

o problema é que ele nem chega a gravar no vetor ele pula direto pro catch, quando depuro o codigo ele entra no while vai pra primeira linha que é lista[cont2][0]=conectaIcms.rs.getString(“EMP_FIL”); quando dou um F8 pra ir pra proxima linha ele vai direto pro catch. e o vetor nessa posição fica vazio

Opa, errei, não é antes da leitura, é antes da gravação…

copia essa parte que indiquei conecta.executaSQL(“select * from tbl_produtos”); da segunda parte.
e cola antes de
while(conectaIcms.rs.next()){

lista[cont2][0]=conectaIcms.rs.getString(“EMP_FIL”);
lista[cont2][1]=conectaIcms.rs.getString(“EMP”);
cont2++;
}

1 curtida

coloquei o select antes do while e ainda setei na primeira posição antes de entrar pro while > conectaIcms.rs.first(); mesmo assim quando depuro o cod ele entra no while e quando vai gravar a primeira linha pula direto pro catch

Impressão minha ou você fez a query dos produtos, e está verificando o conectaIcms?

1 curtida

conectaIcms e um nome qualquer que dei pra minha conexao com o banco, na verdade a minha string sql é gigante com varios inner join, coloquei uma simples so para exemplo e ai com base nisso resolver o problema aqui na empresa.

Poderia colocar a classe inteira então?
pode ser pelo pastebin…

1 curtida

segue o codigo: https://pastebin.com/RKyexcUM

Tenta trocar este trecho
> conectaIcms.rs.first();
> for(int i=0; i<lista.length;i++){
> lista[i][0]= String.valueOf(conectaIcms.rs.getInt(“emp”));
> lista[i][1]= String.valueOf(conectaIcms.rs.getInt(“emp”));
> }

int cont2 = 0;

while(conectaIcms.rs.next()){

lista[cont2][0]=conectaIcms.rs.getString(“EMP_FIL”);
lista[cont2][1]=conectaIcms.rs.getString(“EMP”);
cont2++;
}

Pq no seu exemplo, esse conectaIcms.rs.first(); vai para o primeiro resultado.
Mas e o próximo?
seu resultset deve ser capturado dentro de um laço para pegar registro por registro.
por isso, enquanto conectaIcms.rs.next() ele achar resultado, vai setando e aumentando o contador.

cara muito obrigado resolvi meu problema, por algum motivo quando me disse pra criar a segunda query e setar na primeira posição não tinha ido, mas agora foi.

conectaIcms.executaSQL(“SELECT NFME.EMP_FIL AS emp, NFME.N_FISCAL as num, NFME.SERIE as serie, NFME.FORNEC, NFME.TIPO_MOVTO, NFME.CGC, CRCL.RAZ_SOCIAL, NFME.DT_EMISSAO, NFME.VLR_ICM, \n” +
" NFME.VLR_ICM_SUBST, NFME.CFO, NFME.QT_VOLUME, NFME.TIPO_CONTAB, CRCL.COD_PAIS, TGPA.NOME_PAIS\n" +
“FROM NFME INNER JOIN\n” +
" CRCL ON NFME.EMP_FIL = CRCL.EMP_FIL AND NFME.FORNEC = CRCL.CLIENTE LEFT OUTER JOIN\n" +
" TGPA ON CRCL.COD_PAIS = TGPA.COD_PAIS\n" +
“WHERE (NFME.TIPO_MOVTO = 80 OR\n” +
" NFME.TIPO_MOVTO = 311 OR\n" +
" NFME.TIPO_MOVTO = 850) AND (NFME.DT_EMISSAO >= CONVERT(DATETIME, ‘2017-01-01 00:00:00’, 102) AND NFME.DT_EMISSAO <= CONVERT(DATETIME, \n" +
" ‘2017-01-31 00:00:00’, 102)) AND (NFME.CFO <> 5101) AND (TGPA.EMPRESA = 369) AND (TGPA.FILIAL = 1)\n" +
“ORDER BY NFME.TIPO_MOVTO”);

        conectaIcms.rs.first();           
        for(int i=0; i<lista.length;i++){
                lista[i][0]= String.valueOf(conectaIcms.rs.getInt("emp"));
                lista[i][1]= String.valueOf(conectaIcms.rs.getInt("serie"));
        }