DBNull

DBNull - VB/VBA/VBS - Programmation

Marsh Posté le 24-02-2004 à 18:07:10    

Juste une question....en VB.NET
Lorsqu'on rapatrie d'un dataset certaines valeur sont DBNull
 
lorsque l'on fait  avec ({lrow(1) Is DbNull.Value} = True):
   

Code :
  1. If (lrow(1) Is DbNull.Value) then
  2.        toto = "null"
  3. Else
  4.        toto = lrow(1)
  5. End If


 
ça marche
 
par contre avec :
 

Code :
  1. toto = IIf(lrow(1) Is DbNull.Value,"null",lrow(1))

:pfff:  
 
Il plante et sort un "Cast invalide de Dbnull en String"
En effet, malgré que l'expression est "True", il passe dans la clause false...
 
 
Si l'un de vous apporte une solution...
Merci d'avance

Reply

Marsh Posté le 24-02-2004 à 18:07:10   

Reply

Marsh Posté le 24-02-2004 à 19:58:49    

Citation :

 toto = IIf(lrow(1) Is DbNull.Value,"null",lrow(1))


 
oublie cette notation c'est moche. sinon je sais pas pkoi. peut-être parce que tu écris "if" avec 2 i...


Message édité par jagstang le 24-02-2004 à 19:59:20

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 24-02-2004 à 20:35:56    

Code :
  1. oublie cette notation c'est moche. sinon je sais pas pkoi.


 
c'est moche ? je vois pas pk c moche
 

Code :
  1. peut-être parce que tu écris "if" avec 2 i...


 
T'est sur ke t'as deja touché du VB.NET ???

Reply

Marsh Posté le 24-02-2004 à 22:55:11    

pour le iif, sorry je connaissais pas. j'ai fait 4 mois de C#.NET, mais pas de VB.NET (berk)
 
sinon la notation que tu propose me fais penser à la notation de l'opérateur ternaire "? :" en c++
 
voilà quoi


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 24-02-2004 à 23:03:52    

ha ouaip ok...  
Bah ouaip VB.NET, pas eu le choix... toute l'équipe est deja en VB.NET donc on est obligé de suivre...
 
Merci kan meme

Reply

Marsh Posté le 25-02-2004 à 01:10:39    

le Iif c'est tout simple, je vois simplement par ce topic que son comportement n'a pas changé par rapport à VB6: les deux valeurs possibles de retour sont évaluées, et dans l'un des cas, celui qu'on veut éviter, bin ça provoque l'erreur, donc tu dois faire un if/then/else classique [:spamafote]
 
tu peux essayer un truc genre:
 

Code :
  1. Debug.Print Iif(True, MaFonctionA, MaFonctionB)


 
et vérifier par breakpoints que tu vas passer dans MaFonctionA (normal) et aussi MaFonctionB (et ça c'est dommage)
 
J'ai oublié l'équivalent du Debug.Print en .NET mais tu vois l'idée ;)


Message édité par drasche le 25-02-2004 à 01:11:05

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 25-02-2004 à 10:41:48    

Ouaip je vois le truc, mais mes deux retours ne sont pas des fonctions hélas....
IIF marche parfaitement, enfin il marche pas avec le system.dbnull.value
G posté dans plein de forums et personne ne m'a trouvé de solution...
C pô grave, on va ouvrir un ticket, je vous tiendrai au courant si on a des news
 
a+
 
Et encore merci à tous ;-)

Reply

Marsh Posté le 25-02-2004 à 10:47:12    

bin lrow c'est comme une fonction, tu l'as vu toi même dans ton premier post puisque une structure classique If fonctionne [:spamafote]
pour moi faut pas aller chercher plus loin que ça, je suis certain que c'est ça. Iif essaie d'évaluer l'expression lrow(1) et ça renvoie une erreur (j'ai pris l'exemple de la fonction pour faire ma démonstration mais ça marche aussi avec une variable si elle contient un status d'erreur, ce qui est le cas ici).


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 25-02-2004 à 18:36:22    

JagStang a écrit :

Citation :

 toto = IIf(lrow(1) Is DbNull.Value,"null",lrow(1))


 
oublie cette notation c'est moche. sinon je sais pas pkoi. peut-être parce que tu écris "if" avec 2 i...


 
iif = operateur ternaire de vb
 
 [:bou_le_loup   tt]

Reply

Marsh Posté le 25-02-2004 à 18:39:37    

JagStang a écrit :

pour le iif, sorry je connaissais pas. j'ai fait 4 mois de C#.NET, mais pas de VB.NET (berk)
 
sinon la notation que tu propose me fais penser à la notation de l'opérateur ternaire "? :" en c++
 
voilà quoi


En fait, c'est la notation access/sql server/postgresql, ça vient de la norme SQL, mais M$ aime bien faire des mic-mac de tout dans VB :D (et vice-versa ;))

Reply

Marsh Posté le 25-02-2004 à 18:39:37   

Reply

Marsh Posté le 25-02-2004 à 18:42:07    

drasche a écrit :

le Iif c'est tout simple, je vois simplement par ce topic que son comportement n'a pas changé par rapport à VB6: les deux valeurs possibles de retour sont évaluées, et dans l'un des cas, celui qu'on veut éviter, bin ça provoque l'erreur, donc tu dois faire un if/then/else classique [:spamafote]
 
tu peux essayer un truc genre:
 

Code :
  1. Debug.Print Iif(True, MaFonctionA, MaFonctionB)


 
et vérifier par breakpoints que tu vas passer dans MaFonctionA (normal) et aussi MaFonctionB (et ça c'est dommage)
 
J'ai oublié l'équivalent du Debug.Print en .NET mais tu vois l'idée ;)


Ca m'étonne pas trop...
 
Parceque Iif c'est bêtement (code en VB tout court, en VB.NET ça doit changer un peu, mais ça reste la même chose)
 
function Iif(test as bool, expr1 as variant, expr2 as variant) as variant
   if test then
      Iif = expr1
   else
      Iif = expr2
   end if
end function
 
=> Du coup, normal qu'il vérifie que le type retourné soit compatible avec le type attendu, car c'est bêtement une fonction, et non un oppérateur :)


Message édité par MagicBuzz le 25-02-2004 à 18:42:50
Reply

Marsh Posté le 25-02-2004 à 18:44:22    

magicbuzz> ton algo n'est pas correct, c'est plutôt ceci:

Code :
  1. function Iif(test as bool, expr1 as variant, expr2 as variant) as variant
  2.   Dim retour1 as variant
  3.   Dim retour2 as variant
  4.   retour1 = expr1
  5.   retour2 = expr2
  6.    if test then
  7.       Iif = retour1
  8.    else
  9.       Iif = retour2
  10.    end if
  11. end function


essaie et tu vas voir ;)


Message édité par drasche le 25-02-2004 à 18:44:31

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed