Olá galera,
Estou com dificuldade de achar o erro ao preencher JTextField, poderem me ajudar agradeço.
O erro é o seguinte:
java.sql.SQLException: Illegal operation on empty result set.
a informação não esta fazia no banco de dados, mas mesmo assim da esse erro.
public void preencheCampos() {
int linha = lista.getSelectedIndex();
System.out.println(linha);
conn = Conexao.conector();
try {
if (linha >= 0) {
String sql = “Select * from tbproduto where produto_cod=’” + linha + “’”;
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
rs.first();
txtValorUnitario.setText(String.valueOf(rs.getString(“produto_valor”)));
}
} catch (Exception erro) {
JOptionPane.showMessageDialog(null, "Erro ao mostrar dados " + erro);
System.out.println(erro);
}
}
staroski boa tarde,
Então continua do mesmo a unica diferença agora é que não aparece a mensagem java.sql.SQLException: Illegal operation on empty result set.
Mas os produtos que retorna vazio esta cadastrado no banco de dados.
Tenho 5 produtos cadastrados no banco, desses 5 2 estão não traz resultado.
Outra que percebi fazendo uns teste é que quando clico no Jlist para preencher o txtValorUnitario ele esta trazendo o valor errado.
por exemplo: clico em um produto em traz o valor de outro.
E já conferiu se o SELECT que seu programa faz, está certo, se os parâmetros que você passa para o PreparedStatement estão certos?
Já pegou o mesmo SELECT que você faz no Java e executou diretamente no banco pra ver se traz resultados?
Dicas:
Se você só vai ler 2 colunas, não faça SELECT *, faça SELECT COLUNA_1, COLUNA_2;
Se você usa PreparedStatement, não deve concatenar os parâmetros na String da query;
Procure separar o acesso ao banco da sua interface de usuário, crie uma camada própria pra isso, a interface de usuário deveria interagir somente com os objetos pertinentes ao modelo do seu problema.
Respondendo seus questionamentos
E já conferiu se o SELECT que seu programa faz, está certo? Sim esta, fiz o teste no banco e retorna certinho.
Se os parâmetros que você passa para o PreparedStatement estão certos? Sim estão
Aqui você concatena os parâmetros na String antes de criar o PreparedStatement.
Quando se usa PreparedStatement, não se concatena parâmetros na String, você põe o parâmetro como ? e seta com um método setTipoDeDado(coluna, conteúdo).
Você realmente precisa retornar todas as colunas nesse select?
O código do produto é realmente um double na tabela do banco?
E novamente, você precisa realmente retornar todas as colunas neste select?
Bom dia,
Eu fiz sem concatenar também aí só foi um teste o que preciso mesmo é só retorna o produto_valor
No meu banco o produto_valor está como decimal(10,2).
A cláusula where procura produto que tenha um produto_cod que atenda a seguinte condição:
produto_cod = ?
Quando você faz o PreparedStatement.setAlgumaCoisa, você tem que usar o método apropriado com o tipo de dado desse parâmetro e aí o driver JDBC vai tratar de substituir o ? adequadamente ao executar a query.
Meu já fiz CRUD várias vezes imaginei q sabia oque estava fazendo, pelo jeito tenho muito que aprender.
Fiquei confuso agora.
Se não é dessa forma que fiz não tô entendendo como fazer.
Desculpa amigo vc esta me ajudando muito.
Mas agora travei.
Poderia citar um exemplo de como eu faria essa linha de código.