Erro ao inserir no banco de dados

14 respostas
W

olá pessoal estou tendo um erro ao inserir, não estou conseguindo identificar o erro ele mostra o nome ja fiz algumas alteração mais não tive sucesso,gostaria de ajuda

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

import Mysql.Conexao;

public class EntradaProduto extends JFrame implements ActionListener {

	private JButton btnCadastrado;
	private JButton btncancelar;

	private JTextField txtnome_produto;
	private JTextField txtquantidade_produto;
	private JTextField txtcodigo_produto;
	private JTextField txtpreço_produto;
	private JTextField txtvalidade_produto;

	private JLabel entrada_produto;

	private JLabel nome_produto;
	private JLabel quantidade_produto;
	private JLabel codigo_produto;
	private JLabel preço_produto;
	private JLabel validade_produto;

	public EntradaProduto() {
		MenuCadastro();

	}

	public void MenuCadastro() {

		btnCadastrado = new JButton("Cadastrado");
		btncancelar = new JButton();
		entrada_produto = new JLabel();

		nome_produto = new JLabel();
		quantidade_produto = new JLabel();
		codigo_produto = new JLabel();
		preço_produto = new JLabel();
		validade_produto = new JLabel();

		txtnome_produto = new JTextField();
		txtquantidade_produto = new JTextField();
		txtcodigo_produto = new JTextField();
		txtpreço_produto = new JTextField();
		txtvalidade_produto = new JTextField();

		setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
		this.setLayout(null);

		btnCadastrado.setText("Cadastrado");
		this.add(btnCadastrado);
		btnCadastrado.setBounds(300, 300, 130, 20);
		btnCadastrado.addActionListener(this);

		btncancelar.setText("CANCELAR");
		this.add(btncancelar);
		btncancelar.setBounds(40, 300, 130, 20);

		nome_produto.setText("Nome Produto:");
		this.add(nome_produto);
		nome_produto.setBounds(20, 100, 90, 20);

		txtnome_produto.setBounds(130, 100, 90, 20);
		this.add(txtnome_produto);

		codigo_produto.setText("Codigo:");
		this.add(codigo_produto);
		codigo_produto.setBounds(20, 130, 90, 20);

		txtcodigo_produto.setBounds(130, 130, 90, 20);
		this.add(txtcodigo_produto);

		quantidade_produto.setText("Quantidade:");
		this.add(quantidade_produto);
		quantidade_produto.setBounds(20, 160, 90, 20);

		txtquantidade_produto.setBounds(130, 160, 90, 20);
		this.add(txtquantidade_produto);

		preço_produto.setText("Preço");
		this.add(preço_produto);
		preço_produto.setBounds(20, 190, 90, 20);

		txtpreço_produto.setBounds(130, 190, 90, 20);
		this.add(txtpreço_produto);

		validade_produto.setText("Validade");
		this.add(validade_produto);
		validade_produto.setBounds(20, 220, 90, 20);

		txtvalidade_produto.setBounds(130, 220, 90, 20);
		this.add(txtvalidade_produto);

		entrada_produto.setText("ENTRADA DE PRODUTO");
		this.add(entrada_produto);
		entrada_produto.setBounds(160, 10, 160, 60);

		this.setSize(new Dimension(500, 450));
		this.setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {

		if (((JButton) e.getSource()).getText().equalsIgnoreCase("CADASTRADO")) {
			String sql = "INSERT INTO cadastro_produto(Codigo_Produto, Nome_Produto, validade_Produto, Quantidade_Produto, Preço_produto)"
					+ "VALUES("+ txtcodigo_produto.getText()+ "', '"+ txtnome_produto.getText()+ "', '"+ txtvalidade_produto.getText()
					+ "', '"+ txtquantidade_produto+ "', '"+ txtpreço_produto.getText()+ ");";

			Conexao.insert(sql);
		}

		txtcodigo_produto.setText("");
		txtnome_produto.setText("");
		txtvalidade_produto.setText("");
		txtquantidade_produto.setText("");
		txtpreço_produto.setText("");

	}

	public JButton getBtnCadastrado() {
		return btnCadastrado;
	}

	public void setBtnCadastrado(JButton btnCadastrado) {
		this.btnCadastrado = btnCadastrado;
	}

	public JTextField getTxtnome_produto() {
		return txtnome_produto;
	}

	public void setTxtnome_produto(JTextField txtnome_produto) {
		this.txtnome_produto = txtnome_produto;
	}

	public JTextField getTxtquantidade_produto() {
		return txtquantidade_produto;
	}

	public void setTxtquantidade_produto(JTextField txtquantida_produto) {
		this.txtquantidade_produto = txtquantida_produto;
	}

	public JTextField getTxtcodigo_produto() {
		return txtcodigo_produto;
	}

	public void setTxtcodigo_produto(JTextField txtcodigo_produto) {
		this.txtcodigo_produto = txtcodigo_produto;
	}

	public JTextField getTxtpreço_produto() {
		return txtpreço_produto;
	}

	public void setTxtpreço_produto(JTextField txtpreço_produto) {
		this.txtpreço_produto = txtpreço_produto;
	}

	public JLabel getEntrada_produto() {
		return entrada_produto;
	}

	public void setEntrada_produto(JLabel entrada_produto) {
		this.entrada_produto = entrada_produto;
	}

	public JLabel getNome_produto() {
		return nome_produto;
	}

	public void setNome_produto(JLabel nome_produto) {
		this.nome_produto = nome_produto;
	}

	public JButton getBtncancelar() {
		return btncancelar;
	}

	public void setBtncancelar(JButton btncancelar) {
		this.btncancelar = btncancelar;
	}

	public JTextField getTxtvalidade_produto() {
		return txtvalidade_produto;
	}

	public void setTxtvalidade_produto(JTextField txtvalidade_produto) {
		this.txtvalidade_produto = txtvalidade_produto;
	}

	public JLabel getValidade_produto() {
		return validade_produto;
	}

	public void setValidade_produto(JLabel validade_produto) {
		this.validade_produto = validade_produto;
	}

	public JLabel getQuantidade_produto() {
		return quantidade_produto;
	}

	public void setQuantidade_produto(JLabel quantidade_produto) {
		this.quantidade_produto = quantidade_produto;
	}

	public JLabel getCodigo_produto() {
		return codigo_produto;
	}

	public void setCodigo_produto(JLabel codigo_produto) {
		this.codigo_produto = codigo_produto;
	}

	public JLabel getPreço_produto() {
		return preço_produto;
	}

	public void setPreço_produto(JLabel preço_produto) {
		this.preço_produto = preço_produto;
	}

	public static void main(String[] args) {
		new EntradaProduto();
	}

}

ERRO:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’, ‘BUCHO’, ‘1000’, ‘javax.swing.JTextField[,130,160,90x20,layout=javax.swing.pl’ at line 1

14 Respostas

nel

Erro no teu SQL Insert.
Acho que isso aqui:

'"+ txtpreço_produto.getText()+ ");";

Faltou fechar as aspas simples ao fim.
Cara, não faz assim, usa o PreparedStatement, transforma os valores em ? na sua String e depois só faz algo como :

ps.setString(1, "Teste");

Assim tu não te preocupa com aspas simples e estas coisas.
Abraços.

F

Vale a dica do colega nel!

Dê uma olhada nesse artigo: http://www.guj.com.br/articles/115.

W

Obrigado pela ajuda ela o erro de syntax, porém está gerando outro erro

ERRO:

java.sql.SQLException: Incorrect integer value: ‘javax.swing.JTextField[,130,160,90x20,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,bord’ for column ‘Quantidade_Produto’ at row 1

L

Boa noite,
Algum campo que você definiu como integer está recebendo um valor inválido, lembrando que se deve usar aspas simples no sql somente para campos string.

W

Boa Noite, os campos que não são String estão sem as aspas simples estão dando erro, porém está dando erro no campo quantidade_produto:ele esta com int(10) no banco de dados.

F

O erro está na forma como você está pegando o valor do textfield quantidade_produto no SQL.

cesar_sousa

Concordo com o Nel, sempre que trabalhar com acessos a DB utilize o padrão DAO, e caso for fazer a persistência no braço mesmo utilize
statement, abstrai muito do trabalho de manipulação dos SQLs. vc ganha em qualidade de código com a utilização do Design Pattern e a manutenção
é muito mais fácil e rápida.

CharlesAlves

Cara modifica essa tua sql para

String sql = "INSERT INTO cadastro_produto(Codigo_Produto, Nome_Produto, validade_Produto, Quantidade_Produto, Preço_produto)"  
                    + "VALUES(?, ?, ?, ?, ?);";

e usa um PreparedStatement

PreparedStatement stmt = connection.PreparedStatement(sql);

   //e como está recebendo Strings da interface tem que fazer o casting

  stmt.setString(codigoProduto); //caso o código seja inteiro é só fazer como na linha 8
  stmt.setString(nomeProduto);
  stmt.setValidade(new SimpleDateFormat("dd/MM/yyyy").parse(validadeProduto));
  stmt.setInt(Integer.parseInt(quantidadeProduto));
  stmt.setDouble(Double.parseDouble(precoProduto)); //caso seja utilizado virgula (,) como denominador decimal tem que ser trocado por ponto (.)

agora é só fazer a adaptação para o seu código e seguir as dicas de nel e cesar sousa que você chega lá, caso ainda fique muitas duvidas uma boa é o curso fj21 da caelum, o segundo capítulo fala exatamente de persistência em banco MySql

W

Muito obrigado pela ajuda, mais porém tentei mudar para PreparedStatement, pois está dando muito trabalho para eu, fiz downloads da apostila do link acima muito bom, mai s se poder me ajuda a fazer uma consulta no meu banco de dados eu agradeço no jeito que eu estou usando…

OBRIGADO…

cesar_sousa

Uma das vantagens de usar a API java sql é que vc não precisa escrever estas String sqls frankstein, mas vc pode dar uma melhorada nesta String usando replace, vai ficar bem menos poluída de operadores ‘+’, e no caso de queries, esse lance das aspas simples é um pé no saco.

por exemplo tente utilizar assim…

em vez de

String sql = "INSERT INTO cadastro_produto(Codigo_Produto, Nome_Produto, validade_Produto, Quantidade_Produto, Preço_produto)" + "VALUES("+ txtcodigo_produto.getText()+ "', '"+ txtnome_produto.getText()+ "', '"+ txtvalidade_produto.getText() + "', '"+ txtquantidade_produto+ "', '"+ txtpreço_produto.getText()+ ");";

tente assim.

String sql = "INSERT INTO cadastro_produto(Codigo_Produto, Nome_Produto, validade_Produto, Quantidade_Produto, Preço_produto)" + "VALUES('?1', '?2', '?3', ?4, '?5')" .replace("?1",txtcodigo_produto.getText()) .replace("?2",txtnome_produto.getText()) .replace("?3",txtvalidade_produto.getText()) .replace("?4",txtquantidade_produto) .replace("?5",txtpreço_produto.getText());

usando o replace você evita ter que quebrar sua string para inserir valores de campos de objetos, e seu código fica mais amigável,
porém é fortemente recomendado o uso de PrepareStatement para formatar sua String…

W

Muito Show, OBRIGADO…resolveu os problemas que estavam ocorrendo. pois quero formatar a validade_produto para dd/mm/aaaa e em preço_produto para R$ 1,98.

como posso fazer isso???

cesar_sousa

Não entendi sua pergunta, qual o valor que vc esta recebendo da GUI, vc ja não esta recebendo o valor nestes formatos?

W

Eu quero o formato em valida_produto assim 24/09/2011.
Hoje eu estou recebendo um formato comum 24092011.
quero separar entendeu?

e em preço_produto estou recebendo assim R$198 e eu quero
R$1,98.

obrigado.

cesar_sousa

para a questão da data é fácil…

faça algo do tipo, caso vc trabalhe apenas com string neste padrão (8 digitos) utilize o método String#substring.

String dataFormatada = dataAtual.substring(0,2) + "/" + dataAtual.substring(2,4) + "/" + dataAtual.substring(4);, eu uso este padrão
para trabalhar com mascaras de cpf, cnpj, telefone, o que vc achar necessário, neste caso vc deve se certificar que a string não esteja fora do range do vetor
e tratar a exceção cara o cara digite 2492011 em vez de 24092011.

quanto a questão do valor vc terá que definir regras de negocios e implementa-las em seu algoritmo, por exemplo, vc poderia usa a mesmo
conceito do substring, porem vc tem que tem um regra para identificar se R$198 quer dizer R$ 1,98, ou R$ 198.

Criado 22 de setembro de 2011
Ultima resposta 25 de set. de 2011
Respostas 14
Participantes 6