Questo è un vecchio thread, ma credo che vale la pena notare che dal C# 6 si può :
try
{
await command.ExecuteNonQueryAsync(cancellation);
}
catch (SqlException ex) when (ex.Number == 2627)
{
// Handle unique key violation
}
e con C# 7 e un'eccezione involucro (come Entity Framework core):
try
{
await _context.SaveChangesAsync(cancellation);
}
catch (DbUpdateException ex)
when ((ex.InnerException as SqlException)?.Number == 2627)
{
// Handle unique key violation
}
il più grande vantaggio di questo approccio rispetto alla risposta accettata è:
Nel caso in cui il numero di errore sia non uguale a 2627 e, quindi, non si tratta di una violazione di chiave univoca, l'eccezione non viene rilevata.
Senza il filtro di eccezione (when
) è meglio ricordare di rilanciare quell'eccezione nel caso in cui non sia possibile gestirla. E idealmente non dimenticare di usare ExceptionDispatchInfo
in modo che lo stack originale non vada perso.
fonte
2017-09-12 19:03:56
@Roshan È necessario utilizzare 'SqlException', non' System.Exception', se si utilizzano entrambi, assicurarsi che l'eccezione più specifica abbia il blocco catch sopra l'eccezione meno specifica (in questo caso il blocco catch di 'SqlException 'deve trovarsi sopra il blocco catch di' Exception'). –
Credo 2601 può anche essere una violazione unico indice di – Brain2000
anche la pena notare che è possibile utilizzare il filtro eccezione così si finisce con: 'try {// codice di inserimento } catch (SqlException ex) quando (ex.Number = = 2627) { // fare qualcosa } ' – MJJames