How to handle duplicate key error?

9

How do I handle duplicate key errors? I need to display message to user that "Item is already registered"

Something like this:

try{

  //tenta inserir no Banco de Dados
  context.Produto.Add(_produto);
  context.SaveChanges();

}catch(exceção 1){

  //tratar erro de chave duplicada

}catch(exceção 2){

  // tratar erro diferente de chave duplicada

} 

The error always returns in class catch(Exception ex)

        _repositorio.ProdutoEstoque.Add(_produtoEstoque);
        _repositorio.SaveChanges();
    }
    catch (UpdateException ex)
    {
        SqlException innerException = ex.InnerException as SqlException;
        if (innerException != null && innerException.Number == 2627){                    
            //tratar erro de chave duplicada
            //o jeito que vai informar a view depende do resto da sua aplicação
            string msg = string.Empty;
            msg ="ERRO";
        }else
        {
            throw;
        }
    }
    catch (SqlException ex){
        if (ex.Number == 2627){
            string msg = string.Empty;
            msg = "ERRO";
        }else
        {
            throw;
        }
    }
    catch (Exception ex){  
         throw;               
    }
}

Print Error

    
asked by anonymous 02.10.2015 / 01:26

1 answer

8

I think this is what you need.

try{
    context.Produto.Add(_produto);
    context.SaveChanges();
} catch (UpdateException ex) {
    SqlException innerException = ex.InnerException as SqlException;
    if (innerException != null && innerException.Number == 2627) {
        //tratar erro de chave duplicada
        //o jeito que vai informar a view depende do resto da sua aplicação
    } else {
        throw;
    }
} catch(exceção 2) {
    // tratar erro diferente de chave duplicada
}

By editing the question you still have one exception level DBUpdateException . Then you have to capture her first.

If you are using C # 6 you can improve:

try{
    context.Produto.Add(_produto);
    context.SaveChanges();
} catch (UpdateException ex) when (innerException?.Number == 2627) {
    //tratar erro de chave duplicada
} catch(exceção 2) {
    // tratar erro diferente de chave duplicada
}

If the second exception is Exception it is probably better not capture there .

    
02.10.2015 / 01:42