none
Qual é a melhor estratégia para validar campos duplicados? RRS feed

  • Pergunta

  • Olá pessoal,

     

    Novamente eu aqui com uma duvida meio newbie, mas é o seguinte, tenho de validar campos que não podem existir duplicados na base de dados, como por exemplo CPF, então já na base de dados eu criei um index para cpf como unique, então cada vez que eu tentar adicionar um cpf que já existe vai dar uma SqlException, então minha duvida é como seria uma boa maneira de tratar isso e se tem alguma maneira de descobrir por exemplo qual campo que está com o valor duplicado pela Exception no caso de um index composto (por ex: rg + cpf como unique).

    Por que estou tentando fazer uma forma mais amigável de apresentar os erros para os usuários, e também que seja um pouco mais fácil para mim.

     

    Valeu pela ajuda e paciência.

    • Editado C. Augusto Proiete [MVP]Moderator quinta-feira, 11 de fevereiro de 2010 23:46 Ao abrir um tópico você já indica se trata-se de uma dúvida ou discussão. Não há a necessidade de colocar um "prefixo" no título.
    quinta-feira, 11 de fevereiro de 2010 19:37

Respostas

  • Fala Leonardo,

    Acho que isso até já foi discutido aqui, mas não achei a thread.

    >> E outra, consulta ao banco não custa mais ao sistema do que tratar uma exception ???

    A questão aqui, a meu ver, nem é o custo, mas sim o fato de que exceptions não deveriam ser utilizadas para controlar o fluxo da sua aplicação.
    Além disso, uma exception é, por definição, um tratamento a ser dado a uma situação não prevista no seu sistema, como um banco de dados fora do ar, uma eprmissão de acesso faltando, uma divisão por zero, etc...

    Não ter CPF + RG duplicado é uma regra de negócio do seu sistema, não é uma exceção. Tratar a regra de negócio com exceção, mais uma vez ao meu ver, é no mínimo deselegante, para não dizer que é errado.

    Quanto ao custo, veja esse post do Giovanni Bassi , que esclarece bastante essa questão e tem alguns links bacanas a respeito.

    Espero ter ajudado.

    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    sexta-feira, 12 de fevereiro de 2010 12:42
    Moderador
  • eu faço esse tipo de validação utilizando jquery com o (jquery.validate)

    $('#SeuForm').validate(
            { rules:
                {
                 cpf: { required: true, remote: { url: '/SeuController/SuaAction',
                    type: "post",                
                  }
                  },
              messages:
                {
                  cpf: { required: "<br />CPF obrigatório", remote: $.format("<br />CPF já cadastrado") },           
              errorPlacement: function(error, element) {
                error.appendTo(element.parent("div"));
              }
            });
    
    no campo cpf na pagina exemplo
    <%= html.textbox("cpf") %> vc coloca dentro de uma div
    
    <div><%= html.textbox("cpf") %></div>
    
    aparece o erro abaixo do campo caso o retorno seja True
    
    na sua action vc faz a rotina que vai no banco e verifica se ja tem cadastro entao retorna um bool eu faço com JsonResult
    JsonResult jSonr=new JsonResult();
    
    jSonr.Data=_db.suaconsuta();
    
    return jSonr
    
    acho que assim deve funcionar para oque voce precisa 
    

    quinta-feira, 24 de junho de 2010 01:11

Todas as Respostas

  • Não sei se usar exception seria uma boa.

    Apesar de exigir mais uma volta ao banco de dados você poderia criar um método que verificasse a existência de determinado CPF+RG e em caso verdadeiro adicionar um erro ao seu ModelState.


    quinta-feira, 11 de fevereiro de 2010 21:21
    Moderador
  • Olá John,

    "Não sei se usar exception seria uma boa."

    Acho que já escutei isto, mas qual o mal de uma exception? eu tava com uma idéia que acho que com está frase acabei ficando com o pé atras, eu estava pensando em usar o ELMAH para registrar estes erros fazendo o tratamento da exception e registrando o log na unha lá no ELMAH... 
    E outra, consulta ao banco não custa mais ao sistema do que tratar uma exception ???


    Obrigado

    Att.
    Leonardo Lima
    sexta-feira, 12 de fevereiro de 2010 10:20
  • Fala Leonardo,

    Acho que isso até já foi discutido aqui, mas não achei a thread.

    >> E outra, consulta ao banco não custa mais ao sistema do que tratar uma exception ???

    A questão aqui, a meu ver, nem é o custo, mas sim o fato de que exceptions não deveriam ser utilizadas para controlar o fluxo da sua aplicação.
    Além disso, uma exception é, por definição, um tratamento a ser dado a uma situação não prevista no seu sistema, como um banco de dados fora do ar, uma eprmissão de acesso faltando, uma divisão por zero, etc...

    Não ter CPF + RG duplicado é uma regra de negócio do seu sistema, não é uma exceção. Tratar a regra de negócio com exceção, mais uma vez ao meu ver, é no mínimo deselegante, para não dizer que é errado.

    Quanto ao custo, veja esse post do Giovanni Bassi , que esclarece bastante essa questão e tem alguns links bacanas a respeito.

    Espero ter ajudado.

    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    sexta-feira, 12 de fevereiro de 2010 12:42
    Moderador
  • eu faço esse tipo de validação utilizando jquery com o (jquery.validate)

    $('#SeuForm').validate(
            { rules:
                {
                 cpf: { required: true, remote: { url: '/SeuController/SuaAction',
                    type: "post",                
                  }
                  },
              messages:
                {
                  cpf: { required: "<br />CPF obrigatório", remote: $.format("<br />CPF já cadastrado") },           
              errorPlacement: function(error, element) {
                error.appendTo(element.parent("div"));
              }
            });
    
    no campo cpf na pagina exemplo
    <%= html.textbox("cpf") %> vc coloca dentro de uma div
    
    <div><%= html.textbox("cpf") %></div>
    
    aparece o erro abaixo do campo caso o retorno seja True
    
    na sua action vc faz a rotina que vai no banco e verifica se ja tem cadastro entao retorna um bool eu faço com JsonResult
    JsonResult jSonr=new JsonResult();
    
    jSonr.Data=_db.suaconsuta();
    
    return jSonr
    
    acho que assim deve funcionar para oque voce precisa 
    

    quinta-feira, 24 de junho de 2010 01:11