PreparedStatement não faz busca (select * .....) de coluna específica[RESOLVIDO]

10 respostas
javamysql
R

Bom dia pessoal,
Estou trabalhando em uma aplicação que irá automatizar a conferencia de alguns produtos antes do embarque, lendo o codigo de barras.
Porém tenho um problema, na minha DB, tenho varias colunas, mas as que eu preciso em especial são duas: MATERIAL, e CODIGOBARRAS. quando altero a STRING de comando do MYSQL para MATERIAL, a resposta ocorre normalmente, quando altero para CODIGOBARRAS nao retorna nada, conseguem me ajudar?
segue o código:

public class testa {

Connection con;

public void Remove (String a ){
con = (com.mysql.jdbc.Connection) Conexao.getConnection();
    PreparedStatement stmt = null;
    ResultSet rs;
    try {
        stmt = con.prepareStatement("select qtdOrigem from transportadora1 where material = ?");
      //stmt = con.prepareStatement("select qtdOrigem from transportadora1 where CODIGOBARRAS = ?"); 
        stmt.setString(1, a);
        rs =  stmt.executeQuery();
        while(rs.next()){
            
          JOptionPane.showMessageDialog(null,"RESULT : "+rs.getInt("qtdOrigem"));
        }
        
    } catch (SQLException ex) {
      JOptionPane.showMessageDialog(null,"ERRO: "+ex);
    }

"Só estava me esquecendo; os dados de MATERIAL e CODIGOBARRAS são todos varchar(30) no meu DB.
Apenas o qtdOrigem é inteiro.
abaixo seguem as inportações:

10 Respostas

R

package Funcoes;

import Connection.Conexao;

import bean.Motor;

import com.mysql.jdbc.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.JOptionPane;
darlan_machado

Cara, vou começar com alguns pontos a melhorar, ok?
Primeiro, nomes de classes, em java, por convenção, se iniciam com _ (underline), $ (cifrão) ou letra maiúscula (no caso, Testa seria o correto).

Coloque nomes claros nas classes, atributos, métodos e parâmetros. Assim fica mais fácil entender o que você está escrevendo.

Entendo que é uma opção para algo, mas, não use elementos gráficos nas classes que interagem com o banco de dados. Você viola o princípio de responsabilidade única para as classes.

Só uma curiosidade, você já testou essa query

select qtdOrigem from transportadora1 where CODIGOBARRAS = ?

Diretamente no banco de dados? E o retorno? Está de acordo? Se não, o primeiro passo é esse, testar a query, diretamente no banco e ver o resultado.

R

Bom dia amigo,
Obrigado pelas orientações, essa não é minha classe original, apenas de teste.
Bom quanto ao comando, ele retorna normalmente no DB, apenas na classe em JAVA que ela nao retorna nada.
Seria talvez o comando (rs = stmt.executeQuery(): ) ???

R

Só para esclarecer, a ideia original é usar um IF para verificar se o valor retornado não é zero, e então executar o comando ( Update transportadora1 set qtdOrigem = qtdOrigem -1 where codigoBarras = ? ).

Nesse exemplo utilizei o JOptionPane… apenas para testar o retorno.

darlan_machado

Entendi o conceito.
Teoricamente (e olhando por cima) parece tudo ok com a query.

Creio que não, embora eu prefira invocar o executeQuery antes e depois chamar o getResultSet, mas, teoricamente, não interfere em nada.
Eu sugiro que faça debug do código, identifique o que entra, como fica a String com o parâmetro. Assim fica mais fácil de achar uma luz.

R

O debug não resolveu, quanto a testar como fica a String com o parametro, segue a String:
select transportadora1.qtdOrigem from transportadora1 inner join transportadora on (transportadora1.posicao = transportadora.posicao) where transportadora1.codigoBarras = ‘7890705382784’ ;

Percebi que quando executo da forma acima no DB, o retorno é null.
Como estou buscando um inteiro no ResultSet, acredito que seja isso.

se eu executar da forma acima, porem sem aspas simples no codigo o retorno é o desejado.
Como faço para deixar a linha de comando funcionando com as aspas?

darlan_machado

Se o parâmetro a substituir o “?” na query é uma String, use o setString, caso contrário, use o correspondente ao tipo de dado, afinal, não existe apenas o setString.
Para este caso, o setInt ou setLong.
Para mais informações, veja o javadoc

R

Pelo visto codigoBarras é um número inteiro no banco de dados, com isso deve ser passado apenas números.

E aqui você está passando uma string, fazendo com que o java passe para o banco com as aspas.

R

Boa pessoal, resolvi.
era apenas isso, eu estava inserindo uma string.
Converti o getText para long, e usei o setLong: ficou assim:
public void Remove (Long a ){

con = (com.mysql.jdbc.Connection) Conexao.getConnection();
    PreparedStatement stmt = null;
    ResultSet rs;
    try {
        stmt = con.prepareStatement("select transportadora1.qtdOrigem from transportadora1 "
                + " inner join transportadora on (transportadora1.posicao = transportadora.posicao) where transportadora1.codigoBarras =  ?");
        stmt.setLong(1, a);
wsilvaasc

Faça uma observação no tipo de dado que o banco de dados armazena com relação ao CODIGOBARRA. Se for um Integer, ou Long… se for tente alterar o método setString para setLong

Criado 30 de janeiro de 2018
Ultima resposta 30 de jan. de 2018
Respostas 10
Participantes 4