Attraper une exception spécifique
Comment puis-je attraper exception spécifique à l'aide de c# ?
Dans ma base de données est unique index sur des colonnes.
lorsque l'utilisateur insère enregistrement en double cette exception a été jeter :
Impossible d'insérer une ligne de clé en double dans
l'objet 'dbo.BillIdentity' unique
index IX_BillIdentity'. L'
la déclaration a été résilié.
Comment puis-je attraper cette exception?
Je suis actuellement la vérification à l'aide de ce code :
catch (Exception ex) {
if (ex.Message.Contains("Cannot insert duplicate key row in object 'dbo._BillIdentity' with unique index 'IX__BillIdentity")) {
string ScriptKey = "$(function() {ShowMessage('Error');});";
ScriptManager.RegisterStartupScript(Page, GetType(), "script", ScriptKey, true);
}
}
Je pense que sa mauvaise odeur code.
Est-il un meilleur moyen?
source d'informationauteur Shahin
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas indiqué le type d'exception qui est levée, mais vous pouvez prendre spécifiques type d'exception. Par exemple:
Il est possible qu'il ne sera pas une exception spécifique de type pour juste cette erreur - mais si vous avez à les attraper quelque chose d'assez général comme
SqlException
vous pouvez alors regarder pour plus de détails à l'intérieur de la classe elle-même. Par exemple, dansSqlException
il y a unErrors
de la propriété où vous pouvez regarder des informations plus détaillées sur chacune des (éventuellement plusieurs) des erreurs de la base de données secondaires. Chaquede la fonction SqlError
a alors unepropriété qui donnera le type d'erreur. Vous pouvez toujours vous rabattre sur le message si vous devez absolument, mais alors vous devez être conscient de la possibilité que le message change pour les différentes cultures, etc.
Noter que si vous n'êtes pas vraiment manipulation l'exception, vous devriez probablement renvoyer:
Poignée
SqlException
uniquement dans ce cas.[Modifier]
Pour vérifier le double de la clé d'exception dans MS SQL server:
Edit:
Où 2601 venir?
Retourne:
À l'aide de
exception.Number
et le référencement sys.affichage de messages vous pouvez gérer n'importe quel spécifique MS SQL exception.J'ai juste pris un projet où quelqu'un est allé vers le bas de cette route:
Noter les points suivants (à partir de sys.messages dans SQL Server):
2601 - Impossible d'insérer une ligne de clé en double dans l'objet '%.*ls' avec un index unique '%.*ls'.
Mais ce..?
2627 - Violation de l' %ls contrainte '%.*ls'. Impossible d'insérer une clé en double dans l'objet '%.*ls'."
J'ai juste passé un peu de temps à localiser exactement ce problème.
Et que si nous changeons DB provider? Sans doute 2601 n'est pas absolument universelle... Cela pue, de l'OMI. Et si vous êtes (ou avez été) pour traiter cette question avec la couche de présentation, je pense qu'il y a plus de questions à poser.
Si ce doit être le mécanisme de choix, l'enfouir au plus profond, au plus profond de la DAL et de laisser une Exception personnalisée s'infiltre. De cette façon, les changements à la banque de données (ou, idéalement, ce mécanisme), ont beaucoup plus limitée zone d'effet et vous pouvez traiter l'affaire de manière cohérente, sans aucune des questions de la couche de présentation.
Je suis actuellement penche pour faire un peu de poids pour SÉLECTIONNER un ID sur une connexion ouverte et en évitant l'exception tout à fait.
Vous ne pouviez attraper la SqlException pour commencer