“Non valide utilisation de Null” lors de l'utilisation de Str() avec une valeur Null champ de jeu d'enregistrements, mais Str(Null) fonctionne très bien
Je suis cogner ma tête contre le mur sur celle-ci. Je la regardais quelques vieux de la base de données de reporting code écrit en VB6 et suis tombé sur cette ligne (le code est de déplacer les données à partir d'une "source" de la base de données dans une base de données de rapports):
rsTarget!VehYear = Trim(Str(rsSource!VehYear))
Quand rsSource!VehYear
est Null
, la ligne ci-dessus génère un "Invalid use of Null" erreur d'exécution. Si je casse sur la ligne ci-dessus et tapez le texte suivant dans le volet exécution:
?rsSource!VehYear
Il sorties Null
. Fine, qui fait sens. Ensuite, j'essaie de reproduire l'erreur:
?Str(rsSource!VehYear)
Je un usage incorrect de la valeur Null," erreur.
Cependant, si je tape la commande suivante dans la fenêtre exécution:
?Str(Null)
Je n'ai pas d'erreur. Il a simplement sorties Null
.
Si je répète la même expérience avec Trim()
au lieu de Str()
, tout fonctionne bien. ?Trim(rsSource!VehYear)
retourne Null
, comme le fait ?Trim(Null)
. Pas d'erreurs d'exécution.
Donc, ma question est, comment pouvez - Str(rsSource!VehYear)
éventuellement jeter un "usage incorrect de la valeur Null," erreur lors de la Str(Null)
ne fonctionne pas, quand je savoir que rsSource!VehYear
est égal à Null
?
Mise à jour: Si je tapez la commande suivante dans la fenêtre exécution, il fonctionne comme prévu (aucune erreur ne se produit):
?Str(rsSource!VehYear.Value)
Ce sorties Null
. Maintenant, je sais que rsSource!VehYear
est en fait un ADODB.Field
exemple, mais Value
est par défaut de la propriété, de sorte Str
doit être en fonctionnement sur le Value
de propriété (qui est Null
). Même le message d'erreur"Invalid use of Null") suggère que Str
reçoit un Null
paramètre, mais comment peut-il traiter Null
différemment dans un cas et pas dans l'autre?
Mon seul suppose que c'est la mise en œuvre interne de Str()
est en quelque sorte parviennent pas à obtenir la propriété par défaut, et le "non Valide utilisation de Null," erreur qui se passe pour une raison différente (autre chose que le paramètre est à l'origine de la "Invalid use of Null", peut-être, quand elle est de tenter de récupérer la propriété par défaut de la Field
objet).
Quelqu'un a une technique plus détaillée explication de ce qui se passe réellement ici?
En bref:
?Str(rsSource!VehYear)
déclenche une "utilisation incorrecte de la valeur Null," erreur lors de la rsSource!VehYear
est Null
, mais
?Str(rsSource!VehYear.Value)
retourne Null
.
Toutefois, les deux Trim(rsSource!VehYear)
et Trim(rsSource!VehYear.Value)
retour Null
.
Vous devez vous connecter pour publier un commentaire.
La fonction Str spécifiquement de vérifier si une valeur Null est passé en et de les traiter en conséquence. Lorsque vous passez un objet qu'il tente de convertir le résultat d'une méthode par défaut d'une Chaîne de caractères. Le résultat de la méthode par défaut est pas passé à la méthode Str, mais le Champ objet est, donc, un chèque pour la première Null échouera. La fonction Str continuera de vérifier le type de paramètre pour les types de données qu'il prend en charge quand il se rend compte qu'elle a un objet, il va tenter de récupérer la valeur par défaut. Il n'a pas re-tenter de faire face avec la valeur par défaut comme il l'a fait avec le passé en argument, de sorte que la tentative de retourner une valeur Null comme une Chaîne de caractères sera un échec. Il semble que MS n'a pas s'attendre à une valeur par défaut à Null ou à toute autre valeur non valide pour les Str. Par exemple Str ne prend pas en charge une chaîne vide soit.
Si vous avez besoin d'une valeur autre qu'une chaîne de caractères, essayez d'utiliser la fonction IsNull à la place:
Note de 0 est la valeur par défaut
C'était ma solution de contournement dans le vb6-jours:
la & "" sera assurez-vous qu'il est toujours au moins une chaîne vide à travailler avec.
Trim
etStr
au total depuis le champ de base de données est en fait un champ numérique. Je suis plus intéressé par les raisons techniques pour lesquelles le code en question ne fonctionne pas comme prévu.De la mémoire, null champs de base de données sont
Nothing
(ou peut-êtrevbNull
), qui n'ont pas les mêmes règles s'appliquent à eux commeNull
. Vous devez juste être capable de faire une vérification rapide:Null
. J'ai vérifié par passez la souris sur l'IDE, et par l'impression à la fenêtre exécution.