Problema para exibir lista de consulta MySQL

Por favor, vocês poderiam dar uma olhada na minha lista de erros? Eu uso o NetBeans. Segue abaixo o print:

Se precisar de algum código pode falar qual.
Atenciosamente,
Ronaldo

Traduz a mensagem de erro que você vai entender o motivo de não poder chamar o método getString do seu ResultSet na linha 225 da classe DAOCadForProduto.
:wink:

Isso não vem ao caso, é um erro no código implementado, não na ferramenta de desenvolvimento.

1 curtida

Amigo, não faz isso comigo não eu sou trainie particular, estou aprendendo quase sozinho. Não pede para eu traduzir o erro não. Mas vamos lá, eu vou tentar. Tem uma mensagem que eu pedi pro sistema mostrar que fala da tabela categorias e não é esta tabela a tabela da pesquisa, esta tudo muito estranho. Eu não acho o comando SQL de categorias!!! Veja o print do código e abaixo o codigo do DAO inteiro:

package DAO;

import model.ModelCadForProduto;
import empresaiv.ConexaoMySql;
import java.util.ArrayList;
import model.Fornecedores;
/**
*
* @author Ronaldo R. Godoi
*/
public class DAOCadForProduto extends ConexaoMySql {

    /**
    * grava CadForProduto
    * @param pModelCadForProduto
    * @return int
    */
    public int salvarCadForProdutoDAO(ModelCadForProduto pModelCadForProduto){
        try {
            this.conectar();
            System.out.println("Id produto: " + pModelCadForProduto.getId_produto());
            return this.insertSQL(
                "INSERT INTO fornec_produto ("
                    + "id_produto,"
                    + "id_fornecedor,"
                    + "preco,"
                    + "data_compra,"
                    + "data_cadastro"
                + ") VALUES ("
                    + "'" + pModelCadForProduto.getId_produto() + "',"
                    + "'" + pModelCadForProduto.getId_fornecedor() + "',"
                    + "'" + pModelCadForProduto.getPreco() + "',"
                    + "'" + pModelCadForProduto.getData_compra() + "',"
                    + "'" + pModelCadForProduto.getData_cadastro() + "'"
                + ");"
            );
            
        }catch(Exception e){
            e.printStackTrace();
            return 0;
        }finally{
            this.fecharConexao();
        }
    }

    /**
    * recupera CadForProduto
    * @param pId
    * @return ModelCadForProduto
    */
    public ModelCadForProduto getCadForProdutoDAO(int pId){
        ModelCadForProduto modelCadForProduto = new ModelCadForProduto();
        try {
            this.conectar();
            this.executarSQL(
                "SELECT "
                    + "pk_id,"
                    + "id_produto,"
                    + "id_fornecedor,"
                    + "preco,"
                    + "data_compra,"
                    + "data_cadastro"
                 + " FROM"
                     + " fornec_produto"
                 + " WHERE"
                     + " pk_id = '" + pId + "'"
                + ";"
            );

            while(this.getResultSet().next()){
                modelCadForProduto.setId(this.getResultSet().getInt(1));
                modelCadForProduto.setId_produto(this.getResultSet().getString(2));
                modelCadForProduto.setId_fornecedor(this.getResultSet().getString(3));
                modelCadForProduto.setPreco(this.getResultSet().getDouble(4));
                modelCadForProduto.setData_compra(this.getResultSet().getString(5));
                modelCadForProduto.setData_cadastro(this.getResultSet().getString(6));
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            this.fecharConexao();
        }
        return modelCadForProduto;
    }

    /**
    * recupera uma lista de CadForProduto
        * @return ArrayList
    */
    public ArrayList<ModelCadForProduto> getListaCadForProdutoDAO(){
        ArrayList<ModelCadForProduto> listamodelCadForProduto = new ArrayList();
        ModelCadForProduto modelCadForProduto = new ModelCadForProduto();
        try {
            this.conectar();
            this.executarSQL(
                "SELECT "
                    + "pk_id,"
                    + "id_produto,"
                    + "id_fornecedor,"
                    + "preco,"
                    + "data_compra,"
                    + "data_cadastro"
                 + " FROM"
                     + " fornec_produto"
                + ";"
            );

            while(this.getResultSet().next()){
                modelCadForProduto = new ModelCadForProduto();
                modelCadForProduto.setId(this.getResultSet().getInt(1));
                modelCadForProduto.setId_produto(this.getResultSet().getString(2));
                modelCadForProduto.setId_fornecedor(this.getResultSet().getString(3));
                modelCadForProduto.setPreco(this.getResultSet().getDouble(4));
                modelCadForProduto.setData_compra(this.getResultSet().getString(5));
                modelCadForProduto.setData_cadastro(this.getResultSet().getString(6));
                listamodelCadForProduto.add(modelCadForProduto);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            this.fecharConexao();
        }
        return listamodelCadForProduto;
    }

    /**
    * atualiza CadForProduto
    * @param pModelCadForProduto
    * @return boolean
    */
    public boolean atualizarCadForProdutoDAO(ModelCadForProduto pModelCadForProduto){
        try {
            this.conectar();
            return this.executarUpdateDeleteSQL(
                "UPDATE fornec_produto SET "
                    + "pk_id = '" + pModelCadForProduto.getId() + "',"
                    + "id_produto = '" + pModelCadForProduto.getId_produto() + "',"
                    + "id_fornecedor = '" + pModelCadForProduto.getId_fornecedor() + "',"
                    + "preco = '" + pModelCadForProduto.getPreco() + "',"
                    + "data_compra = '" + pModelCadForProduto.getData_compra() + "',"
                    + "data_cadastro = '" + pModelCadForProduto.getData_cadastro() + "'"
                + " WHERE "
                    + "pk_id = '" + pModelCadForProduto.getId() + "'"
                + ";"
            );
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }finally{
            this.fecharConexao();
        }
    }

    /**
    * exclui CadForProduto
    * @param pId
    * @return boolean
    */
    public boolean excluirCadForProdutoDAO(int pId){
        try {
            this.conectar();
            return this.executarUpdateDeleteSQL(
                "DELETE FROM fornec_produto "
                + " WHERE "
                    + "pk_id = '" + pId + "'"
                + ";"
            );
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }finally{
            this.fecharConexao();
        }
    }
    
    public ArrayList<Fornecedores> getListaFornecedorProd(String pId_produto) {
        ArrayList<Fornecedores> listaFornecedores = new ArrayList();
        ArrayList<ModelCadForProduto> listaModelCadForProduto = new ArrayList();
        Fornecedores fornecedor = new Fornecedores();
        ModelCadForProduto modelCadForProduto;
        try {
            this.conectar();
            this.executarSQL(
                "SELECT "
                    + "id,"
                    + "id_produto,"
                    + "id_fornecedor,"
                    + "preco,"
                    + "data_compra,"
                    + "data_cadastro"
                    + " FROM"
                    + " fornec_produto"
                    + " where id_produto = " + pId_produto
                    + ";"
            );
            while(this.getResultSet().next()){
                modelCadForProduto = new ModelCadForProduto();
                modelCadForProduto.setId(this.getResultSet().getInt(1));
                modelCadForProduto.setId_produto(this.getResultSet().getString(2));
                modelCadForProduto.setId_fornecedor(this.getResultSet().getString(3));
                modelCadForProduto.setPreco(this.getResultSet().getDouble(4));
                modelCadForProduto.setData_compra(this.getResultSet().getString(5));
                modelCadForProduto.setData_cadastro(this.getResultSet().getString(6));
                listaModelCadForProduto.add(modelCadForProduto);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //this.fecharConexao();
        }
        for(int i = 0; i < listaModelCadForProduto.size(); i++) {
            modelCadForProduto = new ModelCadForProduto();
            modelCadForProduto.setId_fornecedor(listaModelCadForProduto.get(i).getId_fornecedor());
            try {
                this.executarSQL(
                        "SELECT "
                        + "id_cgc_cpf, "
                        + "nome_razao, "
                        + "telefone, "
                        + "cidade, "
                        + "estado "
                        + "from fornecedores "
                        + "where id_cgc_cpf = " + modelCadForProduto.getId_fornecedor());
                fornecedor = new Fornecedores();
                fornecedor.setId_cgc_cpf(this.getResultSet().getString(1));
                fornecedor.setNome_razao(this.getResultSet().getString(2));
                fornecedor.setTelefone(this.getResultSet().getString(3));
                fornecedor.setCidade(this.getResultSet().getString(4));
                fornecedor.setEstado(this.getResultSet().getString(5));
                listaFornecedores.add(fornecedor);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                this.fecharConexao();
            }
        }
        
        return listaFornecedores;
        
    }
    
}

Você vai notar que na linha 225 tem o seguinte código:

fornecedor.setId_cgc_cpf(this.getResultSet().getString(1));

Por favor, Staroski, qual problema tem com a linha?
Atenciosamente,
Ronaldo

Prezado, não seja teimoso, a mensagem de erro está lhe dizendo exatamente qual é o problema:
Illegal operation on empty result set.

Traduzindo:
Operação ilegal em um result set vazio.

Que operação é essa?
É a chamada ao método getString no seu ResultSet.

Tem esse problema aqui, conforme descrito na mensagem:
Illegal operation on empty result set.

Isto é, você está tentando ler valores de uma consulta que não retornou nada.

1 curtida

Entendi. Sabe quando você não quer acreditar que o erro é esse porque primeiro não deveria dar esse erro e segundo você não sabe corrigir. Pois é foi isto que aconteceu.

Tenho uma lista de fornecedores que pertencem a um produto. A primeira busca é uma busca pelos fornecedores dentro de um arquivo que relaciona fornecedor e produto. Essa busca deu certo, graças ao bom Deus. O problema é a segunda busca. Estou fazendo algo errado.

Conferi se meu sisteminha de arquivos 1:N estava correto e o produto tem três fornecedores. Eu uso um for para acessar cada um destes três registros que deveriam ser retornados um a um (sou obrigado a fazer três buscas dentro do arquivo principal de fornecedores) mas deu pau.

Veja os três fornecedores (CPF é fictício):

image

Agora vem o erro:
image

O resultset não deveria estar vazio, conclusão, eu fiz algo errado. A classe que faz a busca é o DAO que faz parte deste tópico. Você poderia dar uma olhada e me dizer o que está errado. Vou mandar de novo o trecho da busca (um método inteiro). Agradeço muito a ajuda.

    public ArrayList<Fornecedores> getListaFornecedorProd(String pId_produto) {
        ArrayList<Fornecedores> listaFornecedores = new ArrayList();
        ArrayList<ModelCadForProduto> listaModelCadForProduto = new ArrayList();
        Fornecedores fornecedor = new Fornecedores();
        ModelCadForProduto modelCadForProduto;
        try {
            this.conectar();
            this.executarSQL(
                "SELECT "
                    + "id,"
                    + "id_produto,"
                    + "id_fornecedor,"
                    + "preco,"
                    + "data_compra,"
                    + "data_cadastro"
                    + " FROM"
                    + " fornec_produto"
                    + " where id_produto = " + pId_produto
                    + ";"
            );
            while(this.getResultSet().next()){
                modelCadForProduto = new ModelCadForProduto();
                modelCadForProduto.setId(this.getResultSet().getInt(1));
                modelCadForProduto.setId_produto(this.getResultSet().getString(2));
                modelCadForProduto.setId_fornecedor(this.getResultSet().getString(3));
                modelCadForProduto.setPreco(this.getResultSet().getDouble(4));
                modelCadForProduto.setData_compra(this.getResultSet().getString(5));
                modelCadForProduto.setData_cadastro(this.getResultSet().getString(6));
                listaModelCadForProduto.add(modelCadForProduto);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //this.fecharConexao();
        }
        
        // Conferindo se pegou todos fornecedores
        for(int i = 0; i < listaModelCadForProduto.size(); i++) {
            System.out.println("Fornecedor do produto:" + listaModelCadForProduto.get(i).getId_fornecedor());
        }
        
        for(int i = 0; i < listaModelCadForProduto.size(); i++) {
            modelCadForProduto = new ModelCadForProduto();
            modelCadForProduto.setId_fornecedor(listaModelCadForProduto.get(i).getId_fornecedor());
            System.out.println("fornecedor: " + modelCadForProduto.getId_fornecedor());
            try {
                this.executarSQL(
                        "SELECT "
                        + "id_cgc_cpf, "
                        + "nome_razao, "
                        + "telefone, "
                        + "cidade, "
                        + "estado "
                        + "from fornecedores "
                        + "where id_cgc_cpf = " + modelCadForProduto.getId_fornecedor());
                fornecedor = new Fornecedores();
                fornecedor.setId_cgc_cpf(this.getResultSet().getString(1));
                fornecedor.setNome_razao(this.getResultSet().getString(2));
                fornecedor.setTelefone(this.getResultSet().getString(3));
                fornecedor.setCidade(this.getResultSet().getString(4));
                fornecedor.setEstado(this.getResultSet().getString(5));
                listaFornecedores.add(fornecedor);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                this.fecharConexao();
            }
        }
        
        return listaFornecedores;
        
    }

Esse trecho que faz parte de uma classe DAO é onde está o erro. O método que tem erro pode ser esse (não tenho certeza). Talvez eu esteja acessando o resultset de maneira errada, mas não entendo porque a busca da problema, veja o print abaixo:

image

Se você tiver alguma dúvida e quiser alguma classe ou método é só falar.

Um grande abraço ao pessoal do GUJ,
Ronaldo

O que tem na linha 232 da classe DAOCadForProduto?

Porque o seu ResultSet é uma variável de instância?

Não tenha medo de usar variáveis locais.
Utilize variáveis de instância só para atributos que você deseja manter durante a “vida” de um objeto de sua classe.

Como está implementado o método executarSQL?

Alguma vez você leu a documentação da classe ResultSet?
Sabe o que essa classe representa e como ela funciona?

Novamente, peço que traduza a mensagem de erro:
Before start of result set

Ela é o motivo de estar dando erro.
🤷🏻

A tradução é Antes do início do result set (conjunto de resultados). Eu sei essa tradução, mas ela não me ajuda a resolver o problema. Sobre sua pergunta, eu não lí a documentação e o método executarSQL() foi criado por aquele gerador de código, por isso ResultSet é uma variável de instância.
Eu sei que o aplicativo esta virando um Frank Stein mas é didático. Aprendi muito com ele.
Sobre a linha 232, é que eu fiz um trecho de código para mostrar se os dados dos fornecedores estavam sendo capturados adequadamente pelo select anterior. Daí a linha 225 virou a linha 232. Nela tem:
fornecedor.setId_cgc_cpf(this.getResultSet().getString(1));

Meu inglês não é lá essas coisas e a documentação é toda em inglês.
O que eu faço com este aplicativo para ele rodar?

Opa! Espera aí. Acrescentei o seguinte código:

this.getResultSet().first()

E a coisa melhorou (ainda está com erro). Veja os novos erros no print abaixo:

Atenciosamente,
Ronaldo

Pois é, sempre leia a documentação das classes que você utiliza.

Se ler a documentação do ResultSet vai aprender que ele vem com o cursor posicionado ANTES do primeiro registro encontrado, sendo necessário chamar o método next para posicionar o cursor do ResultSet no próximo registro disponível.

Isso se aprende.
🤷🏻

Staroski, como eu resolvo os problemas do print abaixo?

Atenciosamente,
Ronaldo

É… Vejo que continua não lendo a documentação…
E talvez nem as mensagens respondidas, pois a resposta está na minha mensagem anterior.
:frowning:

Você está chamando o método first do seu ResultSet, como pode ver, a mensagem diz que essa operação não é permitida para o seu ResultSet pois ele é do tipo TYPE_FOWARD_ONLY.

O cursor dele só pode se mover para a frente, isto é, para o PRÓXIMO registro (método next).

Ele não pode voltar para o registro anterior (método previous) nem para o primeiro registro (método first).

1 curtida

Staroski, como eu configuro o resultset para aceitar o método first()?

Atenciosamente,
Ronaldo

No seu caso você não vai chamar o first.
Vai chamar o next, como tem feito em todos os outros códigos até agora.

Se realmente quer insistir em obter um ResultSet que aceite o first e previous então vai ter que ler a documentação da interface Connection e decidir qual método mais adequado para criar os seus Statements.

1 curtida

Staroski, deu certo, valeu!!!