Erro em INSERT INTO com PreparedStatement

8 respostas
P

Olá, eu estou inserindo dados numa tabela do Access usando o ODBC driver. eu estou usando uma interface JFrame mas quando eu clico no botao registrar da o seguinte erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter(JdbcOdbcPreparedStatement.java:1023)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar(JdbcOdbcPreparedStatement.java:3057)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString(JdbcOdbcPreparedStatement.java:766)
at ProductControle.adicionarProduto(ProductControle.java:28)
at SychronizerTest$1.actionPerformed(SychronizerTest.java:29)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6041)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5806)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4413)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4243)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2440)
at java.awt.Component.dispatchEvent(Component.java:4243)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

o codigo eh o seguinte:
import java.sql.*;

public class ProductControle {
	private ProductVisao visao;
	private Connection connection;

	public ProductControle(Connection c) {
		this.visao = new ProductVisao();
		connection = c;
	}

	public void adicionarProduto() {

		try {

			PreparedStatement pstmt;

			//String select = "SELECT description, amount, price FROM ProductsShop";

			//pstmt = connection.prepareStatement(select);
			//ResultSet resultSet = pstmt.executeQuery();

			String insert = "INSERT INTO ProductsShop(description) VALUES('?')";

			pstmt = connection.prepareStatement(insert);
			
			pstmt.setString(1, visao.getJDescricao());
			//pstmt.setInt(2, visao.getJQuantidade());
			//pstmt.setDouble(3, visao.getJPreco());

			pstmt.execute();
			
			connection.close();
		} catch (SQLException sqlex) {
			sqlex.printStackTrace();
			System.err.println(sqlex.toString());
		}
		/*catch(NullPointerException npex){
			System.err.println("que erro eh esse?");
			npex.printStackTrace();
		}*/

	}
}
o com o JFrame eh o seguinte:
import java.awt.*;
import java.awt.event.ActionListener;

import javax.swing.*;

public class ProductVisao extends JFrame{
	protected Container container;
	protected JTextField jCodigo = new JTextField(5);
	protected JTextField jDescricao = new JTextField(10);
	protected JTextField jQuantidade = new JTextField(5);
	protected JTextField jPreco = new JTextField(5);
	protected JButton jBotaoRegistrar = new JButton("Registrar");
	
	public ProductVisao(){
		super("MacShop");
		this.setBounds(100, 100, 700, 500);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		container = this.getContentPane();
		container.setLayout(new FlowLayout());
		this.setTitle("Programa de Vendas");
		container.add(new JLabel("Código do Produto: "));
		container.add(jCodigo);
		container.add(new JLabel("Descrição: "));
		container.add(jDescricao);
		container.add(new JLabel("Quantidade: "));
		container.add(jQuantidade);
		container.add(new JLabel("Preço: "));
		container.add(jPreco);
		container.add(jBotaoRegistrar);
	}
	GridBagConstraints c = new GridBagConstraints();

	public String getJCodigo() {
		return jCodigo.getText();
	}

	public String getJDescricao() {
		return jDescricao.getText();
	}

	public int getJQuantidade() {
		
		return Integer.parseInt(jQuantidade.getText());
	}

	public double getJPreco() {
		return Double.parseDouble(jPreco.getText());
	}

	public void adicionarListenerRegistrar(ActionListener itemListener){
		this.jBotaoRegistrar.addActionListener(itemListener);
		
	}
}

quem saberia corrigir esse erro?

8 Respostas

P

pois eh, ele deveria retornar o que eu digito no JTextField, mas retorna null ai da o NullPointerException

felipealbuquerque

Só para não deixar escapar: o PreparedStatement já coloca as aspas simples de valores alfanuméricos automaticamente, portanto altere o código conforme descrito abaixo:

// De
String insert = "INSERT INTO ProductsShop(description) VALUES('?')";

// Para
String insert = "INSERT INTO ProductsShop(description) VALUES(?)";
P

ah soh, agora nao deu erro nenhum, mas na tabela foi adicionado um item sem nada na descrição, apesar de eu ter digitado algo no campo descrição.

B

Debugue o código, veja se tem algo na String.

P

eu debuguei o codigo e nao acho a string em lugar nehum…

B

A descrição do produto tem que vir de algum lugar né?

P

foi manota minha eu criei um segundo objeto de ProductVisao, ai a String veio vazia.

public ProductControle(Connection c) {
this.visao = new ProductVisao();
connection = c;
}

Sendo que tem uma outra classe com a conecção ODBC que jah tinha um objeto visao criado :p

public static void main(String[] args) {
		final ProductVisao visao = new ProductVisao();
		final ProductControle registrar;
		visao.setVisible(true);
		
		String urlLocal = "jdbc:odbc:LocalShop";
		String urlOnline = "jdbc:odbc:LojaInternet";
		
		try{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			
			Connection connectionLocal = DriverManager.getConnection(urlLocal, "", "");
			Connection conncetionOnline = DriverManager.getConnection(urlOnline, "", "");
			
			
			registrar = new ProductControle(connectionLocal);
			visao.adicionarListenerRegistrar(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					registrar.setVisao(visao);
					registrar.adicionarProduto();

				}
			});
			//Synchronizer sync = new Synchronizer(connectionLocal, conncetionOnline);
			//sync.DoSync();
		}
		catch(ClassNotFoundException cnfex){
			System.err.println("Falha ao carregar o driver JDBC/ODBC :(");
			cnfex.printStackTrace();
			System.exit(1);
		}
		catch(SQLException sqlex){
			System.err.println("Incapaz de conectar :(");
			sqlex.printStackTrace();
		}
	}

}

valeu pela ajuda :D

E

o objeto visao.getJDescricao() esta trazendo alguma?

pstmt.setString(1, visao.getJDescricao());

a grandes possibilidades de ele estar vindo vazio e gerando o erro

Criado 14 de maio de 2008
Ultima resposta 14 de mai. de 2008
Respostas 8
Participantes 4