Cast en int sur SqlCommand-ExecuteScalar erreur de manipulation
J'ai un code qui est peut-être fragile. Cette déclaration ici
int countDis = (int)cmd.ExecuteScalar();
Si je change la procédure stockée pour ne retourne RIEN, alors que le casting pour (int)
est sur le point d'exploser. Si j'ai tout simplement l'enlever, alors je ne peut pas compiler.
Quel est le meilleur code de pratique pour la défensive de codage dans cette situation?
Utiliser les types Nullables comme
Vous pouvez vérifier ces: stackoverflow.com/a/3829494/447156 et blogs.msmvps.com/ryan/2007/01/28/generic-executescalar-method
Si vous modifiez la procédure stockée renvoie rien, alors vous feriez mieux d'utiliser
Je l'ai changé uniquement pour les tests, il est censé être toujours le retour d'un nombre de type int
Procédure stockée SQL Server ne peut pas renvoyer à autre chose qu'un
int?
Vous pouvez vérifier ces: stackoverflow.com/a/3829494/447156 et blogs.msmvps.com/ryan/2007/01/28/generic-executescalar-method
Si vous modifiez la procédure stockée renvoie rien, alors vous feriez mieux d'utiliser
cmd.ExecuteNonQuery
, je pense.Je l'ai changé uniquement pour les tests, il est censé être toujours le retour d'un nombre de type int
Procédure stockée SQL Server ne peut pas renvoyer à autre chose qu'un
int
que leur valeur de retour - si ce n'est pas vraiment un problème...OriginalL'auteur | 2015-09-10
Vous devez vous connecter pour publier un commentaire.
Il suffit de changer le code:
Cela permettra d'assurer que, même si
ExecuteScalar
retournenull
, comme résultat de ne pas sélectionner quelque chose dans une procédure stockée,countDis
aura une valeur de0
. Parce queConvert.ToInt32(null) = 0
.Mise à jour (10/12/2018)
Plus sécuritaire. Merci @Moe pour la mise en évidence
DBNull
cas.C'est un bon point et doit être noté par les futurs lecteurs.
Merci. J'ai mis à jour ma réponse.
OriginalL'auteur Nikhil Vartak
Vous pouvez vérifier la valeur scalaire avant de fonte.
OriginalL'auteur Chandru
J'ai l'habitude d'utiliser les types nullables. par exemple :
Cela fonctionne pour savoir si ExecuteScalar renvoie la valeur null ou DBNull.De la valeur.
OriginalL'auteur Moe Sisko
si vous traitez un résultat de
DBNull.Value
comme le même quenull
en ce qu'ils doivent à la fois être0
, vous pouvez utiliser une seule ligne, si vous êtes toujours à l'aide d'une variable temporaire. Je ne vais pas parler de la vitesse d'exécution:int countDis = int.TryParse(cmd.ExecuteScalar()?.ToString(), out int temp) ? temp : 0
OriginalL'auteur Conner
Que vous pouvez utiliser comme Objet, et de vérifier son type puis prendre votre décision:
Bien sûr, j'ai aussi personnellement préfère pas cela, mais il suffit de mettre ici pour donner une idée de @MillRunner
OriginalL'auteur M_Idrees
Parce que ExecuteScalar pouvez retourner DBNull, le meilleur moyen que j'ai trouvé est:
OriginalL'auteur Hamlet Mendez