Problema com postgre

Primeiramente, oi pra todos :smiley:

Seguinte, estou com um probleminha irritante que não consigo achar a solução

O formulário que estou criando é um de cadastro de fornecedores, e tenho 20 colunas na tabela fornecedores
Fiz um teste e preenchi todos os campos da tabela e coloquei pra mostrar no meu formulario la no netbeans e tudo OK.
Depois fiz para poder receber os valores que vai ser recebido nas caixas de textos, ai que começa meus problemas.
Na tabela a única chave primária e que não aceita valor nulo é o cnpj
Pois bem, quando começo a cadastrar os dados as vezes ele aceita e grava e as vezes nao

Como tenho la meus 20 campos pra preencher, o único que eu sou obrigado a preencher é o CNPJ e os outros eu posso deixar em branco
Mas não é isso que acontece, se eu preencher só CNPJ e o resto nao preencher, ele nao grava.
Se eu preenho os outros tem hora que grava e tem hora que nao.
Agora nao sei pq, os campos que sao character estã no tamanho certo e os que sao integer e biginter também.

Alguém me da uma ajuda por favor.

Valeu a todos!!!

poste o código para darmos uma olhada.

Tá parecendo falta do “commit”.
Geralmente a conexão é feita com “auto-commit” por default, mas você pode tentar forçar um commit para garantir. Algo do tipo:

        ...
        Connection con = DBManager.getConnection();
        Statement stmt = con.createStatement();
        stmt.execute(sql);
        stmt.close();
        con.commit();
        ...

ah, você não falou que tipo de programação você está usando na sua aplicação: Usa uma classe de conexão, como no exemplo acima, ou algum framework de persistência, tipo hibernate?

Então, eu uso uma classe de conexão sim.
Vou postar o código.

Bom, estes comandos que estão comentados (/* */) serve só pra trazer os dados do banco para o fomulário, por isso comentei. Uso só pra testes mesmo. e Depois o código que pega os dados recebidos no formulário.

[code]package cadastros;

import ConexaoBanco.ConexaoBancos;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class fornecedores extends javax.swing.JFrame {

ConexaoBancos conexao_formulario;

public fornecedores() {
    initComponents();

    conexao_formulario = new ConexaoBancos();
    conexao_formulario.conecta("org.postgresql.Driver", "jdbc:postgresql://localhost/contratos", "postgres", "12345", "contratos");
    conexao_formulario.executeSQL("select * from fornecedores");
    /*try
    {
        conexao_formulario.resultset.first();
            txtRazaoSocial.setText(conexao_formulario.resultset.getString("razao_social"));
            txtNomeFantasia.setText(conexao_formulario.resultset.getString("nome_fantasia"));
            txtCnpj.setText(conexao_formulario.resultset.getString("cnpj"));
            txtIE.setText(conexao_formulario.resultset.getString("ie"));
            txtIM.setText(conexao_formulario.resultset.getString("im"));
            txtLogradouro.setText(conexao_formulario.resultset.getString("logradouro"));
            txtNumero.setText(conexao_formulario.resultset.getString("numero"));
            txtAP.setText(conexao_formulario.resultset.getString("ap"));
            txtComplemento.setText(conexao_formulario.resultset.getString("complemento"));
            txtBairro.setText(conexao_formulario.resultset.getString("bairro"));
            txtCidade.setText(conexao_formulario.resultset.getString("cidade"));
            txtDDDComercial.setText(conexao_formulario.resultset.getString("ddd_comercial"));
            txtTelComercial.setText(conexao_formulario.resultset.getString("tel_comercial"));
            txtDDDResidencial.setText(conexao_formulario.resultset.getString("ddd_residencial"));
            txtTelResidencial.setText(conexao_formulario.resultset.getString("tel_residencial"));
            txtDDDCelular.setText(conexao_formulario.resultset.getString("ddd_celular"));
            txtCelular.setText(conexao_formulario.resultset.getString("celular"));
            txtPagWeb.setText(conexao_formulario.resultset.getString("pag_web"));
            txtEmail.setText(conexao_formulario.resultset.getString("email"));
            txtObservacoes.setText(conexao_formulario.resultset.getString("observacoes"));      
    }
    catch(SQLException erro)
    {
        JOptionPane.showMessageDialog(null,"Não localizou os dados "+erro);
    } */
}[/code]

private void btnGravarActionPerformed(java.awt.event.ActionEvent evt) { //Gravação dos dados no banco de dados try { String sqlinsert = "insert into fornecedores (razao_social,nome_fantasia,cnpj,ie,im,logradouro,numero,ap,complemento,bairro,cidade,ddd_comercial,tel_comercial,ddd_residencial,tel_residencial,ddd_celular,celular,pag_web,email,observacoes) values ('"+ txtRazaoSocial.getText()+"','"+ txtNomeFantasia.getText()+"','"+ txtCnpj.getText()+"','"+ txtIE.getText()+"','"+ txtIM.getText()+"','"+ txtLogradouro.getText()+"','"+ txtNumero.getText()+"','"+ txtAP.getText()+"','"+ txtComplemento.getText()+"','"+ txtBairro.getText()+"','"+ txtCidade.getText()+"','"+ txtDDDComercial.getText()+"','"+ txtTelComercial.getText()+"','"+ txtDDDResidencial.getText()+"','"+ txtTelResidencial.getText()+"','"+ txtDDDCelular.getText()+"','"+ txtCelular.getText()+"','"+ txtPagWeb.getText()+"','"+ txtEmail.getText()+"','"+ txtObservacoes.getText()+"')"; conexao_formulario.statement.executeUpdate(sqlinsert); JOptionPane.showMessageDialog(null, "Dados gravados com sucesso!"); } catch (SQLException erro) { JOptionPane.showMessageDialog(null, "Erro ao tentar gravar o registro."); } }

uma dica: use PreparedStatement

poste também o código da classe ConexaoBancos.

Ok, segue o ConexaoBancos e o ConexaoPostgreSQL
Detalhe: Sou iniciante em java ainda, estou aprendendo POO na faculdade. Java só ano que vem, mas ai já estou aprendendo antes por conta própria.

Eu nunca usei o postgre, dizem que ele é bom e tudo mais e integra bem com o java.
Qual o melhor banco que vcs recomendam pra eu usar com o java? É para uma aplicação pequena que deve usar ai no máximo uns 3 computadores em rede.

[code]
package ConexaoBanco;

import java.sql.;
import javax.swing.
;
public class ConexaoBancos
{
//String driver = “org.firebirdsql.jdbc.FBDriver”;
//String url = "jdbc:firebirdsql:localhost/contratos;
//String usuario = “”;
//String senha = “”;
private Connection conexao;
public Statement statement;
public ResultSet resultset;

   //public boolean conecta(String driver,String url, String usuario, String senha)
   public boolean conecta(String driver, String url, String usuario, String senha, String banco)
   {
        boolean result = true;
        try
        {
            Class.forName(driver);
            conexao = DriverManager.getConnection(url, usuario, senha);
            JOptionPane.showMessageDialog(null,"conectou c/ "+banco);
        }
        catch(ClassNotFoundException Driver)
        {
           JOptionPane.showMessageDialog(null,"Driver não localizado: "+Driver);
           result = false;
        }
        catch(SQLException Fonte)
        {
            JOptionPane.showMessageDialog(null,"Deu erro na conexão "+
                    "com a fonte de dados: "+Fonte);
            result = false;
        }
        return result;
   }

   public void desconecta()
   {
        boolean result = true;
        try
        {
            conexao.close();
            JOptionPane.showMessageDialog(null,"banco fechado");
        }
        catch(SQLException fecha)
        {
            JOptionPane.showMessageDialog(null,"Não foi possivel "+
                    "fechar o banco de dados: "+fecha);
            result = false;
        }

   }

   public void executeSQL(String sql)
   {
        try
        {
            statement = conexao.createStatement(
                    ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
            resultset = statement.executeQuery(sql);
        }
        catch(SQLException sqlex)
        {
           JOptionPane.showMessageDialog(null,"Não foi possível "+
                   "executar o comando sql,"+sqlex+", o sql passado foi "+sql);
        }

   }

}[/code]

E agora o ConexaoPostgreSQL

[code]
package ConexaoBanco;

import java.sql.;
import javax.swing.
;
public class ConexaoPostgreSQL
{
public static void main(String args[])
{
String driver = “org.postgresql.Driver”;
String url = “jdbc:postgresql://localhost/contratos”;
String usuario = “postgres”;
String senha = “12345”;
Connection conexao;
Statement statement;
ResultSet resultset;
try
{
Class.forName(driver);
conexao = DriverManager.getConnection(url, usuario, senha);
JOptionPane.showMessageDialog(null,“Conectou com sucesso! \nSGBD: PostgreSQL”);
statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
resultset = statement.executeQuery(“select * from fornecedores”);

            String lista_dados="";
            while(resultset.next())
            {
                lista_dados = lista_dados + "CNPJ: "+resultset.getString("cnpj");
                lista_dados = lista_dados + "\nRazão Social: "+resultset.getString("razao_social")+"\n";
            }
            JOptionPane.showMessageDialog(null, lista_dados);

          }
        catch(ClassNotFoundException Driver)
        {
           JOptionPane.showMessageDialog(null,"Driver não localizado: "+Driver);
        }
        catch(SQLException Fonte)
        {
            JOptionPane.showMessageDialog(null,"Erro na conexão "+
                    "com a fonte de dados: "+Fonte);
        }

    }

}[/code]

outra dica: leia o capitulo 2 sobre jdbc da apostila da Caelum.

não vejo problema nas suas classes de conexão. você pode verificar se tem alguma configuração no PostgreSQL que atribui o autocommit como desligado (tentei encontrar rapidamente alguma coisa na internet, mas sem sucesso).

gosto muito do PostgreSQL (mais do que do MySQL), mas você pode tentar outros bancos de dados como o JavaDB (ou Derby), que já vem na instalação do JDK 6 da Sun, ou o HSQLDB, que é muito fácil de usar.

Entao wdbsjunior, TALVEZ pode o auto-commit mesmo.
Dei uma pesquisada e vi um cara falando que se o autocommit estiver false ele realmente nao salva tudo, entao precisa estar como TRUE.

Mas ainda nao consegui setar no psql o autocommit como true, nao aparece msg de nada … rs

Ai coloquei entao um setAutocommit(true) no codigo da classe ConexaoBancos, mas mesmo assim não deu. Não sei se estou colocando no lugar certo tb.

Class.forName(driver);
conexao = DriverManager.getConnection(url, usuario, senha);
conexao.setAutoCommit(true);
JOptionPane.showMessageDialog(null,"conectou c/ "+banco);

nada?

Seguinte, acho que to quase achando a solução do problema
Eu testei com MySQL e da o mesmo problema
O problema acho que é no código, pq no banco de dados os valores que estão recebem string, fica tudo OK
Os valores que recebem numéricos ai que da pau no formulário meu, eu acho!
Ai no caso como eu faço pro meu JTextField receber o valor inteiro?
Abaixo esta o código, e onde estão os comentários é que são os valores numéricos. Já tentei tirando o ’ ’ e deixando só o +","+

private void btnGravarActionPerformed(java.awt.event.ActionEvent evt) { //Gravação dos dados no banco de dados try { String sqlinsert = "insert into fornecedores (razao_social,nome_fantasia,cnpj,logradouro,numero,ap,complemento,bairro,cidade,pag_web,email) values ('"+ txtRazaoSocial.getText()+"','"+ txtNomeFantasia.getText()+"','"+ txtCnpj.getText()+"','"+ //txtIE.getText()+"','"+ //txtIM.getText()+"','"+ txtLogradouro.getText()+"','"+ txtNumero.getText()+"','"+ txtAP.getText()+"','"+ txtComplemento.getText()+"','"+ txtBairro.getText()+"','"+ txtCidade.getText()+"','"+ //txtDDDComercial.getText()+"','"+ //txtTelComercial.getText()+"','"+ //txtDDDResidencial.getText()+"','"+ //txtTelResidencial.getText()+"','"+ //txtDDDCelular.getText()+"','"+ //txtCelular.getText()+"','"+ txtPagWeb.getText()+"','"+ txtEmail.getText()+"')"; //txtObservacoes.getText()+"')"; conexao_formulario.statement.executeUpdate(sqlinsert); JOptionPane.showMessageDialog(null, "Dados gravados com sucesso!"); } catch (SQLException erro) { JOptionPane.showMessageDialog(null, "Erro ao tentar gravar o registro."); } }