Inserir dados em um banco PostgreSQL em java

4 respostas
Thiago_Bottoni

Boas, galera!

Estou com um problema para fazer o INSERT no PostgreSQL em java. Se alguém puder ajudar, eu agradeço!

Este é o evento do meu botão Incluir:

private void jButtonIncluirActionPerformed(java.awt.event.ActionEvent evt) {
        // Estabelece conexão com o banco
        Connection conn = new ConectaBanco().ConectaAgora();

        // testa se a conexão foi efetuada com sucesso
        if(conn != null) {
            try {
                // Exibe mensagem de sucesso
                System.out.println("Conexão efetuada com sucesso!");

                //cria statement para executar a query
                Statement estado = conn.createStatement();

                estado.executeUpdate("INSERT INTO usuarios (tipo_usuario,nome_usuario,cpf_usuario,endereco_usuario,telefone_usuario,email_usuario,senha) VALUES ('" + jComboBoxTipoUsuario + "','" + jTextFieldNome + "','" + jTextFieldCPF + "','" + jTextFieldEndereco + "','" + jTextFieldTelefone + "','" + jTextFieldEmail + "','" + jPasswordFieldSenha + "')");

                System.out.println("Usuário incluso com sucesso!");

                //trata a excessão
            } catch (SQLException ex) {
                Logger.getLogger(ConsultaUsuarios.class.getName()).log(Level.SEVERE, null, ex);
            }

        //caso de problemas de conexão
        } else {
            System.out.println("Problemas de conexão!");
        }

        //encerra a conexão com o banco de dados
        try {
            conn.close();
            System.out.println("Conexão encerrada com sucesso!");
        //trata a excessão
        } catch (SQLException ex) {
            Logger.getLogger(ConsultaUsuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Isso retorna o seguinte erro:

[color=red]05/09/2010 01:09:10 programa.IncluirUsuario jButtonIncluirActionPerformed

SEVERE: null

org.postgresql.util.PSQLException: ERRO: valor é muito longo para tipo character varying(50)

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)

at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)

at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:252)

at programa.IncluirUsuario.jButtonIncluirActionPerformed(IncluirUsuario.java:211)

at programa.IncluirUsuario.access$200(IncluirUsuario.java:14)

at programa.IncluirUsuario$3.actionPerformed(IncluirUsuario.java:82)

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:6263)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)

at java.awt.Component.processEvent(Component.java:6028)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4630)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)

at java.awt.Container.dispatchEventImpl(Container.java:2085)

at java.awt.Window.dispatchEventImpl(Window.java:2475)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)[/color]

Mas tem um porém, quando eu faço esse mesmo INSERT no pgAdmin III dá certo!

O erro diz que o valor é muito longo para character varying(50), sendo que eu quero colocar apenas a palavra ‘Cliente’. Detalhe, o tamanho do campo era de 15, mesmo aumentando absurdamente, o erro persiste.

Obrigado pela atenção!

o/

4 Respostas

Eric_Yuzo

As variáveis passadas por parâmetro fazem referência aos componentes?

Por que se for você deve invocar o método que retorna a String com o texto:

jComboBoxTipoUsuario.getSelectedItem()

jTextFieldNome.getText()

E assim pra todos os componentes.

Thiago_Bottoni

Nossa, não acredito que eu fiz essa besteira. :shock:

Valeu, Eric!

Por fim, aquela parte do código ficou assim:

estado.executeUpdate("INSERT INTO usuarios (tipo_usuario,nome_usuario,cpf_usuario,endereco_usuario,telefone_usuario,email_usuario,senha) VALUES ('" + jComboBoxTipoUsuario.getSelectedItem() + "','" + jTextFieldNome.getText() + "','" + jTextFieldCPF.getText() + "','" + jTextFieldEndereco.getText() + "','" + jTextFieldTelefone.getText() + "','" + jTextFieldEmail.getText() + "','" + jPasswordFieldSenha.getText() + "')");

Sim, vou melhorar isso depois!

igorsrs

Putz… nào liga pro puxão de orelha não… mas…
USE PreparedStatements em vez de Statements!!!
Já aprenda a coisa do jeito CERTO!
assim:

PreparedStatement estado = conn.prepareStatement("INSERT INTO usuarios (tipo_usuario,nome_usuario,cpf_usuario,endereco_usuario,telefone_usuario,email_usuario,senha) VALUES (?,?,?,?,?,?,?)");
//e seta os parametros (aqueles '?') na mesma ordem
estado.setString(1, jTextFieldNome.getText() );
//repete com todos

Isso evita a temida SQL injection
http://www.macoratti.net/sql_inj.htm
Veja aqui também
http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html

Thiago_Bottoni

Que isso, Igor! Tem que puxar a orelha mesmo. Até porque essa minha pergunta foi falta de atenção, eu já estava o dia todo programando e me atrapalhando todo.

Enfim, gostei dos artigos que passou e foram bastante úteis, pois eu não via diferença em usar Statement e PreparedStatement.

Obrigado! :slight_smile:

Criado 5 de setembro de 2010
Ultima resposta 7 de set. de 2010
Respostas 4
Participantes 3