Duvida - SQL - (RESOLVIDO)

17 respostas
T

Olá pessoal, tudo bem?

Este é meu primeiro post na comunidade, estou começando a estudar agora e estou com uma duvida:

Estou precisando receber os valores de um “JTextField” e encaminhar para um servidor MySQL (no meu caso o XAMP).

Porem estou com erro na sintaxe, será que poderiam me explica qual é este erro?

Acredito que o erro este na linha 13, porem não consegui compreender :cry:

Antecipadamente agradeço a cada postagem!

Abraços

try{
	Connection	conexao = null;
	Statement	stm = null;
	String		msg = "";
	String		sql = "";

	Class.forName("com.mysql.jdbc.Driver");
	conexao = DriverManager.getConnection("jdbc:mysql://localhost/poo_atividade_06", "root", "");
	stm = conexao.createStatement();
	msg = "Conexao realizada com sucesso";
	System.out.println(msg);

	sql = "INSERT INTO tblproduto (codigo, descricao, valor decimal, unidade de medida) VALUES (null, 'textDESC.GetText()', 'textDEC.GetText()', 'textMED.GetText()')";
	stm.executeUpdate(sql);

	JOptionPane.showMessageDialog(null, "Dados incluidos com sucesso.");
		
}catch(Exception erro){
	System.out.println("Erro encontrado: " + erro);
	
}finally{
	System.out.println("Bloco finalizado");
}

17 Respostas

A

É sempre importante que você mostre para gente qual a mensagem de erro ou o sintoma do problema.

Na sua explicação ficou vago o que acontece de errado.

Na linha 13 tem realmente um problema, mas acredito que seria um problema de lógica e não de sintaxe.
(Ele gravaria o texto errado no banco).

Ao invés de corrigir esse código, sugiro que pesquise como utilizar PreparedStatement ao invés do Statement.
Com ele você não vai precisar concatenar nada (que precisaria aqui) e ainda aumenta a segurança e performance do seu código.

T

Valeu Abel,

Segue o erro abaixo:

Erro encontrado: 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 'decimal, unidade de medida) VALUES (null, 'textDESC.GetText()', 'textDEC.GetText' at line 1

Quanto aos comandos “PreparedStatement e Statement.” sinceramente não sei diferencia-los, pois estou começando a estudar java agora, sendo assim já esbarrei na primeira atividade que o professor me passou…

Mas aos poucos vou sim, aprofundar todos estes comandos…

Obrigado

A

A mensagem diz que o erro está na sintaxe da query que está mandando ao banco de dados.

Geralmente quando acontecer isso, é uma boa você imprimir o conteúdo da query no console e ver exatamente o que está rodando no banco:

sql = "INSERT INTO tblproduto (codigo, descricao, valor decimal, unidade de medida) VALUES (null, 'textDESC.GetText()', 'textDEC.GetText()', 'textMED.GetText()')";  

System.out.println(sql); //Coloque aqui pra ver exatamente o que está sendo enviado ao banco!

stm.executeUpdate(sql);

Copiando o texto que você imprimiu, tente rodar direto no seu Mysql.

No seu caso, o problema de sintaxe está nesta parte “valor decimal, unidade de medida)” … você colocou espaços no nome da coluna.
Para funcionar no Mysql (se as colunas realmente estiverem assim no banco) você teria que colocar o nome entre `` (o simbolo em cima do acento).
Ficaria assim: valor decimal, unidade de medida

Mas geralmente colocar espaço no nome das colunas é uma péssima idéia. Recrie a tabela com _ no lugar do espaço: valor_decimal, unidade_de_medida

Há um outro problema, esse de lógica, na sua query. Mas vai perceber sozinho quando essa parte estiver funcionando.

Eu acredito que seu professor nem deveria ensinar o Statement.
Não vejo motivos para usá-lo na prática, portanto poderia começar ensinando pelo PreparedStatement.

T

Consegui compreender Abel,

Eu na verdade só criei a tabela assim porque foi solicitado desta forma, porem acredito que na medida que o curso for se aprofundando o professor irá nos passar estes "padroes".

Olha só, esta diga que vc me deu de testar no MySQl foi show, me ajudou bastante, testei o comando abaixo e funcionou corretamente:

INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, 'Thiago', 1.1, 'T')

Porem como faço para utilizar este conceito com o GetText() ?

Testei das formas abaixo e todas apresentaram erros:

INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, 'textDES.GetText()', 'textDEC.GetText()', 'textMED.GetText()')

Erro encontrado: java.sql.SQLException: Incorrect decimal value: 'textDEC.GetText()' for column 'valor decimal' at row 1
INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, textDES.GetText(), textDEC.GetText(), textMED.GetText())

Erro encontrado: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: FUNCTION textdes.GetText does not exist

Valeu pela ajuda !

gaulix

Teste isso:

sql = "INSERT INTO tblproduto (codigo, descricao, valor decimal, unidade de medida) VALUES (null, " + textDESC.GetText() + ", " + Integer.parseInt(textDEC.GetText()) + ", " + textMED.GetText() + ")";

Se der erro, mande o erro que deu

gaulix

Você pode fazer com preparedStatement, que é muito bom, ficaria mais ou menos assim:

try {
            Connection conexao;
            PreparedStatement stmt;
            String msg;
            String sql;

            Class.forName("com.mysql.jdbc.Driver");
            conexao = DriverManager.getConnection("jdbc:mysql://localhost/poo_atividade_06", "root", "");
            msg = "Conexao realizada com sucesso";
            System.out.println(msg);

            sql = "INSERT INTO tblproduto (codigo, descricao, valor decimal, unidade de medida) VALUES (null, ?, ?, ?)";
            stmt = conexao.prepareStatement(sql);
            stmt.setString(1, textDESC.GetText());
            stmt.setInt(2, Integer.parseInt(textDEC.GetText()));
            stmt.setString(3, textMED.GetText());
            stmt.execute();
            stmt.close(); // lembre-se sempre de dar um close
            conexao.close();

	JOptionPane.showMessageDialog(null, "Dados incluidos com sucesso.");
		
}catch(Exception erro){
	System.out.println("Erro encontrado: " + erro);
	
}finally{
	System.out.println("Bloco finalizado");
}

Acho que é assim que faz com preparedStatement, não pude testar aqui, não tenho mysql instalado nem nada D:
Se tiver alguma coisa errada me corrijam!

Caso de algum erro, copie e cole aqui

T

O programa não rodou,

Quando cliquei em executar ele simplesmente acusa erro sem ao menos executar…

gaulix

Então copie e cole o erro aqui

T

Então, o programa apresenta erro geral antes de rodar, então não é possível verificar um erro especifico.

Link para imagem

http://img502.imageshack.us/img502/6339/semttulodnc.png

gaulix

aaa
eu tava achando que o textDEC, textDESC e os outros eram JTextPane’s… O que eles são? Métodos, Strings, Classes…?

T

seguinte,

Estou precisando receber os valores de um “JTextField” e encaminhar para um servidor MySQL (no meu caso o XAMP).

Estou com dificuldade na sintaxe deste comando sql:

Este funcionou: sql = "INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, 'Thiago', 1.1, 'T')";

Porem este abaixo com GetText() não, sendo assim preciso entender como pegar os dados do JTextField e mandar para o MySQL.

sql = "INSERT INTO `tblproduto`(codigo, descricao, valor decimal, unidade de medida) VALUES (null, 'textDES.GetText()', 'textDEC.GetText()', 'textMED.GetText()')";
samuk1

Em vez disso: textDES.GetText()

não seria isso: textDES.getText()

Se o textDES for um JtextField, os métodos referente a eles seguem a convenção… Ou seja Começão com Minusculo.

T

Então Samuk,

Tentei das duas formas e nada!

Me explica só uma coisa?

Eu preciso criar uma outra classe com os métodos gets?

Vou postar abaixo o programa completo para vcs entenderem, acho que é mais facil né?

package br.sabe.poo.programa;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class Programa {

	private JFrame frame;
	private JTextField textDES;
	private JTextField textDEC;
	private JTextField textMED;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Programa window = new Programa();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Programa() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JLabel lblPooAtividade = new JLabel("POO - Atividade 06");
		lblPooAtividade.setFont(new Font("Calibri", Font.BOLD, 30));
		lblPooAtividade.setBounds(100, 11, 234, 37);
		frame.getContentPane().add(lblPooAtividade);
		
		JLabel lblDescrio = new JLabel("DESCRI\u00C7\u00C3O:");
		lblDescrio.setFont(new Font("Calibri", Font.BOLD, 16));
		lblDescrio.setBounds(10, 86, 80, 20);
		frame.getContentPane().add(lblDescrio);
		
		textDES = new JTextField();
		textDES.setFont(new Font("Calibri", Font.PLAIN, 16));
		textDES.setBounds(100, 81, 250, 25);
		frame.getContentPane().add(textDES);
		textDES.setColumns(10);
		
		JLabel lblNumeroDecimal = new JLabel("VALOR DECIMAL:");
		lblNumeroDecimal.setFont(new Font("Calibri", Font.BOLD, 16));
		lblNumeroDecimal.setBounds(10, 146, 115, 20);
		frame.getContentPane().add(lblNumeroDecimal);
		
		textDEC = new JTextField();
		textDEC.setFont(new Font("Calibri", Font.PLAIN, 16));
		textDEC.setBounds(134, 141, 50, 25);
		frame.getContentPane().add(textDEC);
		textDEC.setColumns(10);
		
		JLabel lblUnidadeDeMedida = new JLabel("UNIDADE DE MEDIDA:");
		lblUnidadeDeMedida.setFont(new Font("Calibri", Font.BOLD, 16));
		lblUnidadeDeMedida.setBounds(10, 206, 149, 20);
		frame.getContentPane().add(lblUnidadeDeMedida);
		
		textMED = new JTextField();
		textMED.setFont(new Font("Calibri", Font.PLAIN, 16));
		textMED.setBounds(169, 201, 50, 25);
		frame.getContentPane().add(textMED);
		textMED.setColumns(10);
		
		JButton btnGravar = new JButton("GRAVAR");
		btnGravar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
								
				//1º Parte - Conectando...
				try{
					Connection	conexao = null;
					Statement	stm = null;
					String		msg = "";
					String		sql = "";
					
					Class.forName("com.mysql.jdbc.Driver");
					conexao = DriverManager.getConnection("jdbc:mysql://localhost/poo_atividade_06", "root", "");
					stm = conexao.createStatement();
					msg = "Conexao realizada com sucesso";
					System.out.println(msg);
								
					//OK Funcionou! 
					//sql = "INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, 'Thiago', 1.1, 'T')";
										
					
					//Erro - Erro encontrado: java.sql.SQLException: Incorrect decimal value: 'textDEC.GetText()' for column 'valor decimal' at row 1
					sql = "INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, 'textDES.GetText()', 'textDEC.GetText()', 'textMED.GetText()')";
					
					
					//Erro - You have an error in your SQL syntax;
					//sql = "INSERT INTO `tblproduto`(codigo, descricao, valor decimal, unidade de medida) VALUES (null, 'textDES.GetText()', 'textDEC.GetText()', 'textMED.GetText()')";
					
					
					
					stm.executeUpdate(sql);
					JOptionPane.showMessageDialog(null, "Dados incluidos com sucesso.");
					
					
				}catch(Exception erro){
					System.out.println("Erro encontrado: " + erro);
										
				}
				finally{
					System.out.println("Bloco finalizado");
				}
			}
		});
		btnGravar.setFont(new Font("Calibri", Font.BOLD, 16));
		btnGravar.setBounds(300, 197, 95, 30);
		frame.getContentPane().add(btnGravar);
	}
}
samuk1

Mude isso: sql = "INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, 'textDES.GetText()', 'textDEC.GetText()', 'textMED.GetText()')";para Isso: sql = "INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, '"+textDES.getText()+"', '"+textDEC.getText()+"', '"+textMED.getText()+"')";
E me fale o que dá!

T

samuk:
Mude isso: sql = "INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, 'textDES.GetText()', 'textDEC.GetText()', 'textMED.GetText()')";para Isso: sql = "INSERT INTO `tblproduto`(`codigo`, `descricao`, `valor decimal`, `unidade de medida`) VALUES (null, '"+textDES.getText()+"', '"+textDEC.getText()+"', '"+textMED.getText()+"')";
E me fale o que dá!

Binguuuuuuuuuuuuuuuuuuuuuuuuuu

valeu Samuk

O segredo foi a aspa dupla dentro da aspa simples?

A explicação para isso é simples ou muito grande?

teria como me explicar?

Se for grande onde posso pesquisar sobre o assunto?

Valeu cara :lol:

Um dia chego lá kkkkk

T

Acho que consegui compreender:

os comando textDES.getText() , textDEC.getText() e textMED.getText() são comando em java, sendo assim estavam dentro da query de SQL e não iriam funcionar correto?

Agora simplesmente “jogou” eles para fora não foi?

samuk1

Seguinte cara… O comando sql recebe uma String, e toda string Começa com Aspas Duplas, e tudo dentro das Aspas duplas é considerado String.
Como vc precisava inserir um valor de um JtF vc precisava sair de dentro da String. Dai Vc Fecha As Aspas Duplas, coloque o "+"para adicionar um valor a String coloque o campo e assim por diante, Isso funciona com qualquer variavel. Não apenas com JtF. Não Sei se esta é a explicação padrão, mas é assim que eu vejo.

Mas Sugiro que vc sente e estude um pouco primeiro antes de sair Programando.

Abraços… :smiley:

Criado 13 de setembro de 2012
Ultima resposta 13 de set. de 2012
Respostas 17
Participantes 4