INSERT INTO com PreparedSatatement

bom galera to tentando um INSERT INTO no usando PreparedStatement mas não sei se esta muito certo o que eu estou fazendo sera que alguem pode me dar uma força ai???

o codigo e esse

cadastrar.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent e){
                	   try{
                    	   Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres",
                    			   "postgres","****");
                       PreparedStatement pstmt = con.prepareStatement("INSERT INTO cliente " +
                       		"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");
                       pstmt.setString(1, campoNome.getText());
                       pstmt.setString(2, campoCpfCnpj.getText());
                       pstmt.setString(3, campoRgInscEst.getText());
                       pstmt.setString(4, campoRuaAv.getText());
                       pstmt.setString(5, campoNumero.getText());
                       pstmt.setString(6, campoComplemento.getText());
                       pstmt.setString(7, campoBairro.getText());
                       pstmt.setString(8, campoCidade.getText());
                       pstmt.setString(9, campoCep.getText());
                       pstmt.setString(10, campoEstado.getText());
                       pstmt.setString(11, campoTelefoneFixo.getText());
                       pstmt.setString(12, campoCelular.getText());
                       pstmt.setString(13, campoEmail.getText());
                       pstmt.executeUpdate();
                       
                       JOptionPane.showMessageDialog(null, "Dados Cadastrados",
                			   "Messagem do Programa",JOptionPane.INFORMATION_MESSAGE);
                	   }
                       catch(Exception event){
                    	   JOptionPane.showMessageDialog(null, "Conexão não estabelecida",
                    			   "Messagem do Programa",JOptionPane.ERROR_MESSAGE);   
                       }
                   }});

vi varias formas de faze o PreparedStatement oque me confundiu um pouco.

desde já agradeço

Olha aparentemente está tudo certo, está dando algum erro?

Você sabe pelo menos que erro está dando? Você precisa do stack trace (que normalmente se produz assim - pegue o método “formatException” e o reaproveite em seus programas.)

import java.io.*;
import javax.swing.*;

class TesteException {
    public static String formatException (Throwable thr) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter (sw);
        thr.printStackTrace (pw);
        return sw.toString();
    }
    public static void main(String[] args) {
        try {
             int x = 100 / 0;
        } catch (Exception ex) {
             JOptionPane.showMessageDialog (null, formatException (ex));
        }
    }
}

experimente subistituir o

pstmt.executeUpdate();

por

pstmt.execute();

sempre uso execute e sempre funcionou

[]'s

Existe diferença entre o ps.execute e o ps.executeUpdate, um retorna boolean e o outro um ResultSet. Sugiro que o markin.r de uma lida no java doc http://java.sun.com/javase/6/docs/api/index.html?java/sql/PreparedStatement.html , e verifique qual a diferença entr os tres “executes” e utilize o que melhor se adeque com oque ele quer fazer.

markin.r, procure utilizar o StringBuilder ao inves de ficar concatenando strings… fica mais “bonito” tente alterar o codig a cima por exemplo assim:

StringBuilder builder = new StringBuilder();

builder.append("Insert into cliente")
           .append(" values(?,?,?,?,?,?,?,?,?,?,?,?,?)");

PreparedStatement pstmt = con.prepareStatement(builder.toString);
...

Caso nãoconheça o StringBuilder e bom dar uma leitura com atenção no java doc tambem!

http://java.sun.com/javase/6/docs/api/index.html?java/lang/StringBuilder.html

Abraços

OBS: so uma dica, toda vez que vc for criar uam string sql, antes de colocar no seu codigo, testa ela no seu banco.

So pra completar um exemplo de inserção de um usuario no banco


@Override
	public Usuario add(Usuario usuario) {

		Connection con = getConexaoFactory().abreConexaoBanco();	

		try {				

			PreparedStatement ps = null;

			if (usuario.getId() == null || usuario.getLogin().equals(null)) {

				usuario.setId(getNovoId());						 

				ps = con.prepareStatement(new StringBuilder()
						 .append("Insert into Usuario (ID,Nome_Completo,")
						.append("Empresa,Login,Email,Status)")
						.append(" values (?,?,?,?,?,?)")
						.toString()
					);

				ps.setLong(1, usuario.getId());
				ps.setString(2, usuario.getNomeCompleto());
				ps.setLong(3, usuario.getEmpresa() == null ? null 
								: usuario.getIDEmpresa());
				ps.setString(4, usuario.getLogin());
				ps.setString(5, usuario.getEmail());
				ps.setInt(6, usuario.getStatus());

				ps.executeUpdate();	

				if (!usuario.getPerfisSistema().isEmpty()) {
					ps = con.prepareStatement(new StringBuilder()
					.append("Insert into Perfil_Usuario")
					.append(" values (?,?)")
					.toString()
					);
					for (PerfilUsuario perfil : usuario.getPerfisSistema()){
						ps.setLong(1, perfil.getIdUsuario());
						ps.setLong(2, perfil.getIdPerfil());
						ps.addBatch();
					}
					ps.executeBatch();
				}

			} else {
				PesquisaUsuario pesquisa = new PesquisaUsuario();
				pesquisa.setId(usuario.getId());				
					
				Set<PerfilUsuario> usuariosAssociados = new HashSet<PerfilUsuario>(
								encontra(pesquisa).one().getPerfisSistema()
						); 
				
				Set<PerfilUsuario> usuariosNaoAssociados = new HashSet<PerfilUsuario>(usuario.getPerfisSistema());

				alteraPerfilUsuario(usuariosAssociados, 
							usuariosNaoAssociados, usuario.getId());
				
				ps = con.prepareStatement(
						new StringBuilder()
						.append("Update Usuario set Empresa = ?,")
						.append(" Nome_Completo = ?, Login = ?,")
						.append(" email = ?, Status = ? where ID = ?")
						.toString()
				);

				ps.setLong(1, usuario.getEmpresa() == null 
							? null : usuario.getEmpresa().getId());
				ps.setString(2, usuario.getNomeCompleto());				
				ps.setString(3, usuario.getLogin());
				ps.setString(4, usuario.getEmail());
				ps.setInt(5, usuario.getStatus());
				ps.setLong(6, usuario.getId());

				if (ps.executeUpdate() == 0) {
					throw new RegistroNaoEncontradoException(usuario.getClass(), usuario.getId());
				}
			}				
			return usuario;
		} catch (SQLException e) {						
				throw new RepositorioException(e);			
		} finally {				
			try {
				con.close();
			} catch (SQLException e) {
				throw new RepositorioException(e);
			}
		}				
	}

O StringBuilder e StringBuffer não são usados para deixar o código ‘mais bonito’ e sim para melhorar a performance para concatenação intensa de dados (dentro de um laço, por exemplo). Nesse caso, concatenar apenas duas String que já estão no heap não faz diferença alguma. Poderia ser feito tudo em uma só inclusive:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO cliente VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");  

Provavelmente essa quebra de linha foi adicionada só para melhorar a legibilidade do código e evitar linhas muito grandes.

Ops esqueci de sitar a melhoria na performace… mais tambem fica muito mais visivel e facil de entender um codigo usando o StringBuilder do que ficar concatenando as string.

Como vc disse, “legibilidade”, ajuda no entendimento do codigo

Abraços

boa tarde pessoal

vivendo e aprentendo e morendo sem sabe.

erro bobos e o que mais da dor de cabeça, erra um erro como base de dados, estava mando conectar na base errada num ia funciona nunca. :oops:

mais vo usar as dica que foram postada aki.

valeu a ajuda galera!!!

t a proxima