2010-08-24 6 views
2

J'essaye d'écrire une fonction générique qui vérifiera chaque paramètre de base de données pour voir si elle est nulle, et si c'est le cas, retourner DBNull; sinon, renvoie l'objet.Fonction générique VB.NET pour vérifier une valeur de null

Voici donc ma fonction:

Public Shared Function CheckForNull(ByVal obj As Object) As Object 
    If obj <> Nothing Then Return obj Else Return DBNull.Value 
End Function 

Mon problème est que certains des objets je passe à la fonction sont Nullable. Donc, je peux passer la fonction un long? ou Int ?, mais lorsqu'un type Nullable est passé à la fonction, il est converti en son type de valeur. Donc, si je passe un long? qui a une valeur de 0, la fonction renvoie DBNull parce que le long? est converti en Long et une valeur de 0 pour un Long équivaut à Nothing. Y a-t-il un moyen de faire fonctionner cette fonction pour les types Nullable?

Sinon, je vais revenir à l'aide des instructions suivantes au lieu d'un appel funciton générique:

IIf(nullableVar.HasValue, nullableVar, DBNull.Value)) 

et

IIf(nonNullableVar IsNot Nothing , nonNullableVar, DBNull.Value)) 

Répondre

2

Ce n'est pas pourquoi votre logique échoue. Lors de l'évaluation d'une expression comme (x = y) ou (x <> y), si l'un des arguments est Nothing, VB.Net renvoie FALSE. Votre condition passe toujours à la clause ELSE. Ainsi, au lieu de:

if obj <> Nothing then 

essayer place:

if obj isnot nothing then 
+0

Merci pour votre intervention. En tant que développeur C# ayant à écrire VB.NET, je suis toujours aux prises avec la manipulation correcte de 'Nothing'. La modification de '<>' en 'IsNot' résout le problème. Cependant, j'ai un problème avec la réponse en cela, mon évaluation originale 'obj <> Nothing' fonctionne dans tous les cas, sauf lors de la comparaison d'un type de valeur nullable qui a une valeur de zéro contre rien. Lorsque je passe une chaîne à la fonction qui n'est pas rien, la fonction renvoie correctement la chaîne. –

+0

Est-ce que l'opérateur '<> convertit un type de valeur nullable en un type de valeur normal, et c'est pourquoi lorsque le type de valeur a la valeur 0, la comparaison échoue et renvoie DBNull? –

+0

Il y a probablement une conversion implicite en cours. M $ aime "nous" aider les programmeurs VB Wimpy. Je mets toujours Option Strict On comme première ligne de n'importe quel fichier de code pour empêcher ce genre de comportement inattendu. – Bill

Questions connexes