OVH Cloud OVH Cloud

ADO.Net - valeur Nullable - Conversion

18 réponses
Avatar
Michael Moreno
Bonjour,

Je cree un DataReader qui contient une collonne de type SqlDecimal qui
peut etre nulle.

Afin d'obtenir la valeur que je dois enregistrer dans une variable de
type double j'ai ecrit le code suivant :

double PremiumCashFlow = 0;

if (dr["PremiumCashflow"] != System.DBNull.Value)
PremiumCashFlow = (double)((Decimal) dr["PremiumCashflow"]);


Est-ce que j'utilise la bonne methode pour ce genre de cas ?

Cela me parait lourd.
J'ai essaye de caster en SqlDecimal et d'utiliser la propriete IsNull
mais si la valeur dans la dr (DataReader) est nulle une exception de
type InvalidCast est levee.

Merci bien.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/

10 réponses

1 2
Avatar
Tsunoo Rhilty
ceci peut etre t'aider
http://www.dotnet-news.com/lien.aspx?ID244

sinon réécrit ta routine en passant par une fonction qui fera le test du
genre :

PremiumCashFlow = ReadSqlDouble( dr, "PremiumCashflow");

double ReadSqlDouble(...) { if(....) return... else return 0; }
Avatar
Merlin
Michael Moreno a écrit :
double PremiumCashFlow = 0;

if (dr["PremiumCashflow"] != System.DBNull.Value)
PremiumCashFlow = (double)((Decimal) dr["PremiumCashflow"]);


Est-ce que j'utilise la bonne methode pour ce genre de cas ?

Cela me parait lourd.



C'est un peu lourd en effet. Il existe des tas de façons de faire mais
pour rester dans ta solution tu peux au moins simplifier :

1/ ça sert à rien d'initialiser la variable à la déclaration dans ce
code là
2/ le test et l'assignation peuvent se faire comment suit :

PremiunCashFlow = (dr["PremiumCashFlow"]=System.DBNull) ? 0 :
Convert.ToDouble(dr["PremiumCashFlow"]);

Et comme on te le propose par ailleurs dans le thread, tu peux en effet
créer une méthode qui fait le test.

--

///3rL1n_______
Avatar
Michael Moreno
Merci.

1/ ça sert à rien d'initialiser la variable à la déclaration dans ce code là



Etant donne que dans le if il n'y a pas de "else" l'initialisation me
parait importante.

2/ le test et l'assignation peuvent se faire comment suit :



le test
dr["PremiumCashFlow"]==System.DBNull
plante lorsque la valeur est nulle

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Michael Moreno
Merci bien.
Le probleme est qu'il me faut convetir dans un premier temps en Decimal
puis en double pour que le cast fonctionne. Si je pouvais caster en
double directement une telle fonction m'aurait plus en effet.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Merlin
> Etant donne que dans le if il n'y a pas de "else" l'initialisation me parait
importante.



je parlais de la réécriture avec ?: qui évite cette initialisation
inutile puisque si la valeur est non nulle elle a lieu une fois pour
rien.

le test
dr["PremiumCashFlow"]==System.DBNull
plante lorsque la valeur est nulle



c'est un exemple écrit à la volée, j'ai oublié ce détail en effet.

--

///3rL1n____
Avatar
Sébastien FERRAND
Bonjour Michael,

si tu es en .net 2.0, tu peux utiliser les types Nullable...

double? PremiumCashFlow = (double)((Decimal) dr["PremiumCashflow"]);


---
Sébastien FERRAND [MVP C#]
http://blogs.developpeur.org/sebmafate
msnim:

Bonjour,

Je cree un DataReader qui contient une collonne de type SqlDecimal qui
peut etre nulle.

Afin d'obtenir la valeur que je dois enregistrer dans une variable de
type double j'ai ecrit le code suivant :

double PremiumCashFlow = 0;

if (dr["PremiumCashflow"] != System.DBNull.Value)
PremiumCashFlow = (double)((Decimal) dr["PremiumCashflow"]);
Est-ce que j'utilise la bonne methode pour ce genre de cas ?

Cela me parait lourd.
J'ai essaye de caster en SqlDecimal et d'utiliser la propriete IsNull
mais si la valeur dans la dr (DataReader) est nulle une exception de
type InvalidCast est levee.
Merci bien.



Avatar
Michael Moreno
Merci

je parlais de la réécriture avec ?: qui évite cette initialisation inutile
puisque si la valeur est non nulle elle a lieu une fois pour rien.



Le else est un branchement extremement couteux en performance et c'est
une fonction dans laquelle j'essaie d'epargner chaque micro seconde.

--

----------------------------------------------

http://michael.moreno.free.fr/
Avatar
Michael Moreno
> Bonjour Michael,

si tu es en .net 2.0, tu peux utiliser les types Nullable...

double? PremiumCashFlow = (double)((Decimal) dr["PremiumCashflow"]);



Merci je suis sous 1.1 et
(Decimal) dr["PremiumCashflow"]
lance une exception InvalidCast si dr[".."] est NULL.

Sous .Net 2.0 ca passe vraiment ?

--

----------------------------------------------

http://michael.moreno.free.fr/
Avatar
Merlin
> Le else est un branchement extremement couteux en performance et c'est une
fonction dans laquelle j'essaie d'epargner chaque micro seconde.



Tu n'avais pas précisé que la lourdeur concernait plus l'exécution que
l'écriture. Dans ce cas oui il vaut mieux éviter ce qui pompe du temps.
Tu as un profiler ?

--

///3rL1n____
Avatar
Der§en
Traîtres, tu abandonnes lâchement Borland ;o)))

Der§en.



"Michael Moreno" a écrit dans le message
de news:
Bonjour,

Je cree un DataReader qui contient une collonne de type SqlDecimal qui
peut etre nulle.

Afin d'obtenir la valeur que je dois enregistrer dans une variable de type
double j'ai ecrit le code suivant :

double PremiumCashFlow = 0;

if (dr["PremiumCashflow"] != System.DBNull.Value)
PremiumCashFlow = (double)((Decimal) dr["PremiumCashflow"]);


Est-ce que j'utilise la bonne methode pour ce genre de cas ?

Cela me parait lourd.
J'ai essaye de caster en SqlDecimal et d'utiliser la propriete IsNull mais
si la valeur dans la dr (DataReader) est nulle une exception de type
InvalidCast est levee.

Merci bien.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/



1 2