Le code suivant donne une erreur - "Aucune conversion implicite de DBnull en int."
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
c#
dbnull
sqlparameter
Relativité
la source
la source
==
à la fin de la 3ème ligne?)Réponses:
Le problème est que l'
?:
opérateur ne peut pas déterminer le type de retour car vous retournez unint
valeur ou une valeur de type DBNull, qui ne sont pas compatibles.Vous pouvez bien sûr convertir l'instance d'AgeIndex en un type
object
qui satisferait l'?:
exigence.Vous pouvez utiliser l'
??
opérateur de fusion nul comme suitVoici une citation de la documentation MSDN pour l'
?:
opérateur qui explique le problèmela source
AgeItem.AgeIndex as object
??
est la même solution que si vous deviez utiliser le ternaire régulière?:
- vous avez encore besoin de plâtreAgeItem.AgeIndex
à un objet:planIndexParameter.Value = AgeItem.AgeIndex.HasValue ? (object)AgeItem.AgeIndex : DBNull.Value;
.?:
pour effectuer une comparaison spécifique au type, la conversion de l'expression entière ne fonctionnera pas. Vous devez transtyper le paramètre non-dbnull comme ceci:someID == 0 ? DBNull.Value : (object)someID
La réponse acceptée suggère d'utiliser un plâtre. Cependant, la plupart des types SQL ont un champ Null spécial qui peut être utilisé pour éviter cette conversion.
Par exemple,
SqlInt32.Null
«représente un DBNull qui peut être affecté à cette instance de la classe SqlInt32».la source
exampleNoCast
est déclaré objet, de sorte que la conversion en objet se produit toujours. Si, comme dans le code de l'OP, la valeur est affectée directement à SqlParameter.Value qui est également de type object, alors vous obtenez toujours le cast.Vous devez passer en
DBNull.Value
tant que paramètre nul dans SQLCommand, sauf si une valeur par défaut est spécifiée dans la procédure stockée (si vous utilisez une procédure stockée). La meilleure approche consiste à attribuerDBNull.Value
tout paramètre manquant avant l'exécution de la requête, et le fait de suivre foreach fera l'affaire.Sinon, modifiez cette ligne:
Comme suit:
Parce que vous ne pouvez pas utiliser différents types de valeurs dans une instruction conditionnelle, car DBNull et int sont différents l'un de l'autre. J'espère que cela aidera.
la source
Avec une ligne de code, essayez ceci:
la source
Essaye ça:
la source
Si vous utilisez l'opérateur conditionnel (ternaire), le compilateur a besoin d'une conversion implicite entre les deux types, sinon vous obtenez une exception.
Vous pouvez donc résoudre ce problème en lançant l'un des deux vers
System.Object
:Mais comme le résultat n'est pas vraiment joli et que vous devez toujours vous souvenir de ce casting, vous pouvez utiliser une telle méthode d'extension à la place:
Ensuite, vous pouvez utiliser ce code concis:
la source
À mon avis, le meilleur moyen est de le faire avec la propriété Parameters de la classe SqlCommand :
la source
DBNull.Value
, ADO.NET pourrait avoir un peu de mal à deviner quel SqlDbType cela pourrait être ........ c'est pratique - mais un peu dangereux ....Pensez à utiliser la structure Nullable (T) disponible. Cela vous permettra de définir des valeurs uniquement si vous les avez, et vos objets de commande SQL reconnaîtront la valeur Nullable et traiteront en conséquence sans tracas de votre part.
la source
la source
Essaye ça:
En d'autres termes, si le paramètre est nul, ne l'envoyez pas à votre proc stocké (en supposant, bien sûr, que le proc stocké accepte des paramètres nuls qui sont implicites dans votre question).
la source
essayez quelque chose comme ça:
la source
Je résous comme ça.
la source
la source
C'est ce que je fais simplement ...
la source
la source
Une méthode d'extension simple pour cela serait:
la source
J'utilise une méthode simple avec une vérification nulle.
la source
Mon code, travaillant dans un projet réel Regardez l'opérateur ternaire avant de définir le paramètre sql, c'est le meilleur moyen pour moi, sans problèmes:
la source