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
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
.
Isso não vem ao caso, é um erro no código implementado, não na ferramenta de desenvolvimento.
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.
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):
Agora vem o erro:
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:
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.
🤷🏻
É… Vejo que continua não lendo a documentação…
E talvez nem as mensagens respondidas, pois a resposta está na minha mensagem anterior.
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
).
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 Statement
s.
Staroski, deu certo, valeu!!!