Erro ao inserir nas tabelas

5 respostas
C

Pessoal,

to tentando inserir um objeto dentro das tabelas na sequencia:

Inserir endereço na tabela ENDEREÇO -> Buscar a chave estrangeira que está contida em cliente e inserir em cliente e assim por diante.

O problema é que quando ele vai p/ a tabela do endereço, mas quando chega no processo de ir ao cliente. acontece erro da sintaxe do sql.
Se puderem dar um help eu agradeço de coração! Valeu!

package fornecedor;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Vector;

import util.Endereco;

import conexao.GerenciadorConexoes;

public class RepositorioFornecedorDB implements IRepositorioFornecedor {

	private static GerenciadorConexoes controladorConection = null;

	public synchronized static GerenciadorConexoes getInstanciaControladorConection() {

		if (controladorConection == null) {

			controladorConection = new GerenciadorConexoes();
		}
		return controladorConection;
	}

	public RepositorioFornecedorDB() {

	}

	@Override
	public void inserirFornecedor(Fornecedor fornecedor)throws FornecedorCadastradoException {

		controladorConection = getInstanciaControladorConection();

		try {
			if (existeFornecedor(fornecedor.getIdentificador())) {

				throw new FornecedorCadastradoException(fornecedor.getIdentificador());
				
			} else {
				
				//inserindo na tabela de de endereço
			    String sqlEndereco = "INSERT INTO tb_endereco " +
			    				     "(cep                   ," +
			    				     "rua                    ," +
			    				     "numero                 ," +
			    				     "complemento            ," +
			    				     "bairro                 ," +
			    				     "cidade                 ," +
			    				     "estado                 )" +
			    				     "values   (?,?,?,?,?,?,?)" ;
			    
			    PreparedStatement preStmEndereco = controladorConection.conectar().prepareStatement(sqlEndereco);
			    preStmEndereco.setString(1, fornecedor.getEndereco().getCep());
			    preStmEndereco.setString(2, fornecedor.getEndereco().getRua());
			    preStmEndereco.setString(3, fornecedor.getEndereco().getNumero());
			    preStmEndereco.setString(4, fornecedor.getEndereco().getComplemento());
			    preStmEndereco.setString(5, fornecedor.getEndereco().getBairro());
			    preStmEndereco.setString(6, fornecedor.getEndereco().getCidade());
			    preStmEndereco.setString(7, fornecedor.getEndereco().getEstado());
			    
			    preStmEndereco.executeUpdate();			    
			    
			    //____________________________________________________________________________________			    
			    
			    //pegando do codigo da tabela de endereço
			    String sqlCodigoEndereco = "SELECT id         FROM tb_endereco                       " +
			    		                   "WHERE  cep    = "+fornecedor.getEndereco().getCep()    +"" +
			    		                   "and    numero = "+fornecedor.getEndereco().getNumero() +"" ;
			    
			    Statement stmCodigoEndereco = controladorConection.conectar().createStatement();			    
			    ResultSet resultSetCodigoEndereco = stmCodigoEndereco.executeQuery(sqlCodigoEndereco);
			    
			    //____________________________________________________________________________________
			    
			    //inserindo na tabela pessoa
			    String sqlPessoa = "INSERT INTO tb_pessoa   " +
			     				   "(email                 ," +
			     				   "nome                   ," +
			     				   "fone                   ," +
			     				   "data_nascimento        ," +
			     				   "data_cadastro          ," +
			     				   "tb_endereco_id         ," +
			     				   "tipo                    " +			     				   
			     				   "values     (?,?,?,?,?,?,?)" ;
			    
			    PreparedStatement preStmPessoa = controladorConection.conectar().prepareStatement(sqlPessoa);
			    preStmPessoa.setString(1, fornecedor.getEmail());
			    preStmPessoa.setString(2, fornecedor.getNome());
			    preStmPessoa.setString(3, fornecedor.getFone());
			    preStmPessoa.setDate(4, fornecedor.getDataNascimento());
			    preStmPessoa.setDate(5, fornecedor.getDataCadastro());
			    preStmPessoa.setInt(6, resultSetCodigoEndereco.getInt("id"));
			    preStmPessoa.setString(7, "FORNECEDOR");
			    
			    preStmPessoa.executeUpdate();
			    
			    //____________________________________________________________________________________
			    
			    //pegando o codigo da tabela pessoa
			    String sqlCodigoPessoa = "SELECT id       FROM tb_pessoa         "+
			    						 "WHERE email = "+fornecedor.getEmail()+"";
			    
			    Statement stmCodigoPessoa = controladorConection.conectar().createStatement();
			    ResultSet resultSetCodigoPessoa = stmCodigoPessoa.executeQuery(sqlCodigoPessoa);
			    
			    //____________________________________________________________________________________
			    
			    //inserindo na tabela de fornecedor
			    String sqlFornecedor = "INSERT INTO tb_fornecedor " +
			    					   "(cnpj                     " +
			    					   "tb_pessoa_id             )" +
			    					   "values(?,?)               " ;
			    
			    PreparedStatement preStmFornecedor = controladorConection.conectar().prepareStatement(sqlFornecedor);
			    preStmFornecedor.setString(1, fornecedor.getIdentificador());
			    preStmFornecedor.setInt(2, resultSetCodigoPessoa.getInt("id"));
			    
			    preStmFornecedor.executeUpdate();
			    
			    //....................................................................................
			    
			    	preStmEndereco.close();
			    	preStmPessoa.close();
			    	preStmFornecedor.close();
			    	
			    	stmCodigoEndereco.close();
			    	stmCodigoPessoa.close();
			    	
			    	resultSetCodigoEndereco.close();
			    	resultSetCodigoPessoa.close();
			}
			
		} catch (SQLException e) {
			
			e.printStackTrace();
			
		} finally {
			
			controladorConection.desconectar(controladorConection.conectar());
		}
	}

Essa é apenas a parte do método InserirFornecedor, qual estou utilizando para clientes também..ou seja, o erro é igual

Segue o 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 'numero = bla' at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
	at com.mysql.jdbc.Util.getInstance(Util.java:384)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2512)
	at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1476)
	at fornecedor.RepositorioFornecedorDB.inserir(RepositorioFornecedorDB.java:71)
	at fornecedor.CadastroFornecedor.cadastrar(CadastroFornecedor.java:17)
	at fachada.Concessionaria.cadastrarFornecedor(Concessionaria.java:51)
	at aplication.Aplication.main(Aplication.java:38)

5 Respostas

Elizeu_Santos
the right syntax to use near 'numero = bla' at line 1

verifica esse objeto “numero” ai.

e estas linhas também:

at fornecedor.RepositorioFornecedorDB.inserir(RepositorioFornecedorDB.java:71) at fornecedor.CadastroFornecedor.cadastrar(CadastroFornecedor.java:17) at fachada.Concessionaria.cadastrarFornecedor(Concessionaria.java:51) at aplication.Aplication.main(Aplication.java:38)

Elizeu_Santos

ah
Você tem um código bem enxuto.
isso facilita a quem tenta ajudar, parabéns.

alberthy

Brother, depois dá uma olhada em Hibernate e JPA.

Sobre o seu erro, acho que está no primeiro SELECT. Dê uma olhada na coluna número!

Ele retorna o id normalmente?

Abraço.

A

Acredito que o erro esteja sendo causado pelo seu próprio teste. Você por acaso estaria tentando cadastrar um endereço e passando “bla” para o número do endereço?

Seu código está muito bom de fato, mas pode melhorar. Observo que você usa PreparedStatement somente para os insert, mas ele também funciona para os select!!

O campo ID está definido como autoincremento no banco? Se sim, vou te dar uma dica prática de como obtê-lo sem ter que dar um select atrás dele. Veja este trecho:

String key[] = {"ID"} // certifique-se de passar o nome da coluna do jeito como está no banco, considerando maiusculas/minusculas
int IDendereco;
PreparedStatement preStmEndereco = controladorConection.conectar().prepareStatement(sqlEndereco, key);  
//... continue passando os parametros para o preStmEndereco do jeito que já estava fazendo
preStmEndereco.executeUpdate();

ResultSet rst = preStmEndereco.getGeneratedKeys();
while(rst.next()){
   IDendereco = rst.getInt("ID"); // certifique-se de passar o nome da coluna do jeito como está no banco, considerando maiusculas/minusculas
}
Elizeu_Santos

eu falei isso ali em cima…

Criado 5 de junho de 2011
Ultima resposta 5 de jun. de 2011
Respostas 5
Participantes 4