sehe ich zwei Fragen hier, und hier ist mein nehmen ...
Datenbank Einschränkungen gut sind? Für große Systeme sind sie unabdingbar. Die meisten großen Systeme haben mehr als ein Frontend und sind nicht immer in kompatiblen Sprachen verfügbar, in denen die Logik zur Überprüfung der mittleren Ebene oder der Benutzerschnittstelle geteilt werden kann. Sie können Batch-Prozesse auch nur in Transact-SQL oder PL/SQL haben. Es ist in Ordnung, die Prüfung am Frontend zu duplizieren, aber in einer Multi-User-App ist die einzige Möglichkeit, die Eindeutigkeit wirklich zu überprüfen, der, den Datensatz einzufügen und zu sehen, was die Datenbank sagt. Gleiches gilt für Fremdschlüsseleinschränkungen - Sie wissen es erst, wenn Sie versuchen, es einzufügen/zu aktualisieren/zu löschen.
Sollen Ausnahmen ausgelöst werden oder sollten Rückgabewerte ersetzt werden? Hier ist der Code von der Frage:
try
{
// inset data
}
catch (SqlException ex)
{
if (ex.Message.ToLower().Contains("duplicate key"))
{
if (ex.Message.ToLower().Contains("url"))
{
return 1; // Sure, that's one good way to do it
}
if (ex.Message.ToLower().Contains("email"))
{
return 2; // Sure, that's one good way to do it
}
}
return 3; // EVIL! Or at least quasi-evil :)
}
Wenn Sie, dass der anrufende Programm handeln garantieren kann tatsächlich auf der Grundlage der Rückgabewert, ich denke, die return 1
und return 2
sind am besten links nach Ihrem Urteil. Ich ziehe es vor, eine benutzerdefinierte Ausnahme für Fälle wie diese erneut auszulösen (zum Beispiel DuplicateEmailException
), aber das bin nur ich - die Rückgabewerte werden auch den Trick tun. Schließlich können Verbraucherklassen Ausnahmen ebenso ignorieren wie Rückgabewerte.
Ich bin gegen die return 3
. Dies bedeutet, dass eine unerwartete Ausnahme aufgetreten ist (Datenbank inaktiv, schlechte Verbindung, was auch immer). Hier haben Sie einen nicht spezifizierten Fehler, und die einzige diagnostische Information, die Sie haben, ist diese: "3". Stellen Sie sich vor, eine Frage zu SO zu stellen, die sagt Ich habe versucht, eine Zeile einzufügen, aber das System sagte '3'. Bitte beraten. Es wäre innerhalb von Sekunden geschlossen werden :)
Wenn Sie nicht wissen, wie eine Ausnahme in der Datenklasse zu handhaben, gibt es keine Möglichkeit einen Verbraucher der Datenklasse kann damit umgehen. An diesem Punkt sind Sie ziemlich abgespritzt, also sage ich, dass der Fehler protokolliert wird, und beenden Sie dann so elegant wie möglich mit der Meldung "Unerwarteter Fehler".
Ich weiß, dass ich ein wenig über die unerwartete Ausnahme rankte, aber ich habe zu viele Support-Anfragen bearbeitet, bei denen der Programmierer Datenbankausnahmen nur weiterverfolgte, und wenn etwas unerwartet kam, scheiterte die App entweder im Hintergrund oder fehlgeschlagen Information. Sehr frech.
Als Neben, wenn Sie dies überprüfen. Ich würde nach dem ErrorCode suchen, da dieser eindeutiger und weniger wahrscheinlich zu ändern ist: http://msdn.microsoft.com/en-us/library/aa258747(v=sql.80).aspx –