Gravar valores null em java

13 respostas
K

bom dia! estou terminando o sistema desktop de controle de material, o cliente pediu para adicionar alem do tombo, cologar o numero_serial do aparelho! só que em alguns aparelhos velhos não foi cologado o tombamento, sendo assim ele vai gravar o tombamento ou numero_serial como valor null, o problema e que ele não aceita no meu programa gravar mais registros nullos, pois sempre que faço um rs.first no banco ele acha esse registro. Tem como adicionar mais registros nullos sem ele reclame!?

aqui esta meu codigo:

//  con_impressoras e o nome da minha conexao.
 public  void testarCampos() throws Exception {
        try {
            if (tf_nome.getSelectedItem() == null) {
                throw new Exception("O campo nome é Obrigatorio!");
            }
            if (tf_origem.getSelectedItem() == null) {
                throw new Exception("O campo origem é Obrigatorio!");
            }
            if (tf_destino.getSelectedItem() == null) {
                throw new Exception("O campo destino é Obrigatorio!");
            }
            if (tf_data.getCalendar() == null) {
                throw new Exception("O campo destino é Obrigatorio!");
            }
            if (tf_tombo.getText() == null || (tf_codigo_serial.getText() == null)) {
                throw new Exception("Por favor, insira o campo TOMBO ou Nº SERIAL");
            } 
        } catch (Exception e) {
            throw new Exception(e);
        } 
    }

private void botao_gravarActionPerformed(java.awt.event.ActionEvent evt) {                                             
    try {
        boolean ok;
        try {
            this.testarCampos();
            ok = true;
        } catch (Exception ex) {
//                Logger.getLogger(newcad_impressoras_2.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Preencha os Campos Obrigatorios, marcados com (*)");
            ok = false;
        }
        // String aux = tf_data.getText();
        // System.out.print(aux);
        // String dia = aux.substring(0, 1);
        // String mes = aux.substring(3, 4);
        // String ano = aux.substring(6, 9);
        // System.out.print(dia);
        // System.out.print(mes);
        // System.out.print(ano);
        if (ok == true) {
            //Transforma o getCalendar em Date
            Calendar cal = tf_data.getCalendar();
            Date data = cal.getTime();
            // formata e exibe a data e hora
            Format formato = new SimpleDateFormat("yyyy/MM/dd");

            //if(tf_tombo.getText() == null );
            //  JOptionPane.showMessageDialog(null,"Preencha os Campos Obrigatorios, marcados com (*)");

            //executa SQL verificando se existe o tombo 
            con_impressoras.executeSQL("Select * From cad_estoque Where Tombo = '" + tf_tombo.getText() + "'");
            //se existir o tombo emiti uma msg de tombo ja existente
            if (con_impressoras.resultset.first()) {
                JOptionPane.showMessageDialog(null, "O tombo já existe!");
            } else { //senao...executa SQL verificando se existe o codigo serial
                con_impressoras.executeSQL("Select * From cad_estoque Where codigo_serial = '" + tf_codigo_serial.getText() + "'");
                //se existir o tombo emiti uma msg de serial ja existente
                if (con_impressoras.resultset.first()) {
                    JOptionPane.showMessageDialog(null, "O Codigo_serial ja existe!");
                } else {//se nao faz o insert

                    String sqlinsert = "insert into cad_estoque(nome,data,tombo,origem,destino,situacao,codigo_serial)values('"
                            + tf_nome.getSelectedItem() + "',"
                            + "'" + formato.format(data) + "'" + ",'"
                            + tf_tombo.getText() + "','"
                            + tf_origem.getSelectedItem() + "','"
                            + tf_destino.getSelectedItem() + "','"
                            + tf_situacao.getText() + "','"
                            + tf_codigo_serial.getText() + "')";

                    System.out.println(sqlinsert);
                    con_impressoras.statement.executeUpdate(sqlinsert);

                    JOptionPane.showMessageDialog(null, "Gravação realizada com sucesso");


                    //atualiza o resultset //
                    //  con_impressoras.resultset = con_impressoras.statement.executeQuery("select * from  cad_estoque ");


                    con_impressoras.executeSQL("select * from cad_estoque by" + ordenacao);
                    con_impressoras.resultset.first();
                    mostrar_dados();
                }
            }
        }

obrigado pela atenção…

13 Respostas

drsmachado

Teu problema está no banco.
Ou você altera a propriedade da coluna que contém os dados do tombo ou tomba todos os equipamentos que não possuem tal informação (o que, a critério de controle, seria o ideal).
Colocar o tombo como null poderia causar vulnerabilidade no sistema, afinal, se alguém omite o tombo, isso será válido para o bd…

K

eu concordo com vc! as columas tombo e numero_serial estão em not_null desabilitado, mesmo assim ele esta acusando que existe um registro nullo quando faço o resultset. será que estou passando os valores como vazio?

drsmachado

As colunas aceitam nulo, certo?
Ocorre algum erro ao realizar a consulta ao banco?
Se sim, posta ai.

K

ele nao da erro no banco!
quando vou cadastrar com um campo vazio tombo ou numero_ serial ele avisa que tombo ou serial já existem, no caso o null!

drsmachado

O select que você faz retorna resultados pois vão existir informações onde o valor do tombo e do numero_serial são nulos. É como uma pesquisa “SELECT * FROM ALGUM_LUGAR WHERE 1 = 1”, é certeza de retorno.
Se você não pretende corrigir a inconsistência do banco (serial ou tombo deveriam ser PK), então faça a validação no código, coloque algo do tipo
[code
if(valorRetornoTombo != null && !valorRetornoTombo.equals("")){
[/code]

drigo.angelo

Tem a função Coalesce ou Isnull (depende do sgbd) no sql, que pode ser utilizado para o banco não retornar valores null

K

o problema esta no meu codigo, pois quando faço insert diretamente no banco com os valores dos campos em branco ele salva o registro sem problema

drsmachado

Posta o código que faz a consulta.

G

Na linha 68 do seu código faça a seguinte alteração:

+ tf_tombo.getText().isEmpty() ? null : tf_tombo.getText() + "','"

Já tive um problema parecido usando Postgre, isso resolveu.

K

o meu sgbd que estou usando tb e o postgre.

xxjamisxx

aspas “” assim nao resoveria seu ploblema
pq assim ele nao reclamaria de valor nullo

drsmachado

Posta o código do insert e do select.

L

É tudo uma questão de vc saber o que e quais sql’s estão executando

Primeiro, antes de você fazer uma alteração, leia sobre isso:

Seu sistema esta cheio, tudo errado.

Agora verifique esse código:

String a = null;
        System.out.println("aaaa '" + a +"'");

Perceba que ira imprimir: aaaa ‘null’, logo seu código:

con_impressoras.executeSQL("Select * From cad_estoque Where Tombo = '" + tf_tombo.getText() + "'");

Caso tf_tombo.getText() esteja retornando nulo, ele está criando o SQL: Select * From cad_estoque Where Tombo = ‘null’, ou seja, procurando por um tombo com a string “null” e não necessariamente com valor nulo.

Isso vai acontecer também lá no seu insert, você não esta inserindo nulo no valor de tombo e sim a string “null”, como o campo deve ser unicle, só pode haver um registro com tombo “null”, por isso no próximo da erro.

Reveja todo seu código, se você entender o primeiro código do meu post (do aaaa somando com null) vai entender fácil que problema esta ocorrendo no seu sistema.

Meu conselho, leia sobre sql inject, elimine eles usando PreparedStatement, tanto no insert quanto nos select’s, valide que no seu banco esta incluindo nulo mesmo, que então todos seus problemas se resolvem… tá fácil, basta vc entender qual está sendo o problema

Criado 2 de fevereiro de 2011
Ultima resposta 3 de fev. de 2011
Respostas 13
Participantes 6