Comment puis-je obtenir un message d'erreur qui se produit lors de l'utilisation de ExecuteNonQuery ()?
Je suis l'exécution d'une commande de cette façon :
var Command = new SqlCommand(cmdText, Connection, tr);
Command.ExecuteNonQuery();
Dans la commande il y a une erreur, cependant .NET ne jetez pas de message d'erreur. Comment pouvais-je savoir que la commande n'est pas exécutée correctement, et comment obtenir de l'exception?
source d'informationauteur Haider Ali Wajihi
Vous devez vous connecter pour publier un commentaire.
Vous obtiendrez seulement une exception en C# si le message d'erreur de gravité est de 16 ans ou au-dessus. Si vous utilisez une IMPRESSION, vous n'obtiendrez pas une exception .NET.
Si vous pouvez modifier le lever code d'erreur, ce serait la cause d'une SqlException en C#:
Vous pouvez obtenir à chaque erreur dans la SqlException.Les erreurs de collecte.
Juste un side-note - SQL Serveur continuera à exécuter des commandes après la
RAISERROR
si vous n'avez pasRETURN
directement par la suite. Si vous n'avez pas de retour, vous pouvez obtenir plusieurs erreurs de retour..NET posent effectivement un message d'erreur... si la gravité est de 16 ans ou au-dessus (car il déclenche une exception) - le message sera à l'exception
.Message
. Si vous utilisezRAISERROR
avec une baisse de la gravité (ou à l'aide dePRINT
), alors vous devrez vous abonner à laInfoMessage
événement sur la connexion.Seulement de haute gravité, les erreurs seront rejetés dans ExecuteNonQuery. Il y a un autre scénario que j'ai observé avec OdbcCommand.ExecuteNonQuery() la méthode. Peut-être que c'est vrai pour SqlCommand.ExecuteNonQuery (). Si le SQL contenues dans la propriété CommandText est un état unique (Exemple: INSERT INTO table (col1,col2) VALUES (2,'ABC'); ) et si il y a une clé étrangère de la violation ou de violation de clé primaire dans la déclaration ci-dessus ExecuteNonQuery lèvera une exception. Toutefois, si votre CommandText est un lot où vous avez plus d'un SQL séparées par un point-virgule (Comme Plusieurs INSERTIONS ou des MISES à jour) et si l'un d'eux échoue ExecuteNonQuery ne pas lever une exception de retour. Vous devez être explicitement vérifier le nombre d'enregistrements affectés retournée par la méthode. Tout simplement en mettant le code dans un try{}Catch{} l'habitude de l'aide.
Essayer de le ci-dessous.
PS: Juste parce que vous utilisez une transaction, vous ne pouvez pas négliger la gestion des exceptions et des restaurations.
Et c'est la bonne gestion des transactions:
Vous attrapez la SqlException utilisation de try/catch
La Méthode suivante Attraper les détails de SqlException qui peut être connecté ou affiché à l'utilisateur
Le message Généré par ressembler à:
Inspiré par le travail de M Hassan, Stefan Steiger, et Marc Gravel dans ce thread, ici, c'est un minimum de preuve de concept exemple de ce qui se passe ici: