it-swarm.com.de

Wie Identifizieren der Primärschlüssel-Duplizierung anhand eines SQL Server 2008-Fehlercodes?

Ich möchte wissen, wie wir den Primärschlüssel-Duplizierungsfehler anhand des SQL Server-Fehlercodes in C # ermitteln.

Als Beispiel habe ich ein C # -Formular, um Daten in eine SQL Server-Datenbank einzugeben. Wenn während der Dateneingabe ein Fehler auftritt. Wie kann ich die Ursache für den Fehler anhand der Ausnahme ermitteln?

17
Roshan

Wenn Sie SqlException abfangen und dann dessen Nummer sehen, würde die Nummer 2627 die Verletzung einer eindeutigen Einschränkung (einschließlich Primärschlüssel) bedeuten. 

try
{
    // insertion code
}
catch (SqlException ex)
{
    if (ex.Number == 2627)
    {
        //Violation of primary key. Handle Exception
    }
    else throw;
}

MSSQL_ENG002627

Dies ist ein allgemeiner Fehler, der unabhängig davon ausgelöst werden kann, ob eine Datenbank wird repliziert. In replizierten Datenbanken lautet der Fehler normalerweise ausgelöst, weil Primärschlüssel nicht ordnungsgemäß verwaltet wurden in der Topologie.

49
Habib

Dies ist ein alter Thread, aber ich denke, es ist erwähnenswert, dass Sie seit C # 6 Folgendes können:

try
{
    await command.ExecuteNonQueryAsync(cancellation);
}
catch (SqlException ex) when (ex.Number == 2627)
{
    // Handle unique key violation
}

Und mit C # 7 und einer Wrapping-Ausnahme (wie Entity Framework Core):

try
{
    await _context.SaveChangesAsync(cancellation);
}
catch (DbUpdateException ex) 
   when ((ex.InnerException as SqlException)?.Number == 2627)
{
    // Handle unique key violation
}

Der größte Vorteil dieses Ansatzes gegenüber der akzeptierten Antwort ist:

Falls die Fehlernummer nicht gleich 2627 ist und es sich somit nicht um eine eindeutige Schlüsselverletzung handelt, wird die Ausnahme nicht abgefangen.

Ohne den Ausnahmefilter (when) sollten Sie sich besser daran erinnern, diese Ausnahme erneut ausgelöst zu haben, falls Sie nicht damit umgehen können. Und nicht zu vergessen, ExceptionDispatchInfo zu verwenden, damit der ursprüngliche Stapel nicht verloren geht.

3
Bruno Garcia

Arbeitscode für Filter, Ausnahme bei Verletzung des Primärschlüssels

using System.Data.Entity.Infrastructure;
using System.Data.SqlClient;
.........

 try{
    abc...
    }
    catch (DbUpdateException ex)
                {
                    if (ex.InnerException.InnerException is SqlException sqlEx && sqlEx.Number == 2601)
                    {
                        return ex.ToString();
                    }
                    else
                    {
                        throw;
                    }
                }

Beachten Sie feine Details: - ex.InnerException.InnerException nicht ex.InnerException

0
Tauqeer

Im Falle von Entity Framework funktioniert die akzeptierte Antwort nicht und der Fehler wird nicht erfasst. Hier ist ein Testcode, nur die Entity-Catch-Anweisung wird getroffen oder natürlich die generische Ausnahme, wenn die Entity-Anweisung entfernt wird:

try
{
    db.InsertProcedureCall(id);
}
catch (SqlException e0)
{
   // Won't catch
}
catch (EntityCommandExecutionException e1)
{
    // Will catch
    var se = e1.InnerException as SqlException;
    var code = se.Number;
}
catch (Exception e2)
{
   // if the Entity catch is removed, this will work too
    var se = e2.InnerException as SqlException;
    var code = se.Number;
}
0
usefulBee