Diskusní fóra - Téma

Otázka - zodpovězená Téma: Přetypování a DBNull

RSS Feed RSS Feed

Diskusní fóra > C# > Přetypování a DBNull

Přetypování a DBNull

Datum: 1.9.2010 12:40
Autor: neregistrovaný (188.175.15.110)
Hodnocení autora: není
Příspěvků: 0
Zdravím,
získáváme hodnoty z databáze pomocí DataReader:


object obj = myReader["NazevSloupce"];
 

Jaký je podle Vás nejelegantnější způsob, jak toto přetypovat např. na některý z Nullable typů tak, aby se korektně zpracovaly i hodnoty NULL? DataReader v takovém případě vrací typ System.DBNull, který ovšem není přetypovatelný na Nullable.(explicitní přetypování System.DBNull -> (double?) vrací chybu)

Napadá mě použít nějakou takovou funkci:


public double? DoubleDbParse(object obj)
{
   if (obj is System.DBNull)
      return null;

   return (double?)obj;
}
 

Jenže podobnou funkci by potom bylo nutné vytvořit pro každý použitý datový typ. Neznáte elegantnější řešení?
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Příspěvek odpovídá na otázku Re: Přetypování a DBNull

Datum: 1.9.2010 13:23
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
No, můžete to udělat genericky:

public T HandleDBNull<T>(object value)
{
    if (value == DBNull.Value)
        return (T)null;
    else
        return (T)value;
}
 

A voláte:
 double? value = HandleDBNull<double?>(reader["blabla"]); 



Anebo druhá možnost je využít operátoru přetypování as.
 reader["blabla"] as double? 

Pokud je hodnota typu double, vrátí to hodnotu, pokud je jiného typu, vrátí to null, což je přesně to, co chcete.


Píšu to z hlavy, netestuju, takže možná v tom je chybka.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Přetypování a DBNull

Datum: 1.9.2010 13:55
Autor: neregistrovaný (188.175.15.110)
Hodnocení autora: není
Příspěvků: 0
Děkuji za radu a rychlou odpověď.

Operátor as ... že mě to nenapadlo, ten se k tomu přímo nabízí :-)

Generická varianta funguje také, jen Váš kód je třeba upravit, protože generuje chybu při překladu (není možné přetypovat null na T, protože T by mohl být i nenullovatelný hodnotový typ.

Pokud se však metoda upraví takto:


public Nullable<T> HandleDBNull<T>(object value) where T: struct
{
    if (value == DBNull.Value)
        return (Nullable<T>)null;
    else
        return (Nullable<T>)value;
}
 

a volání takto:


 double? value = HandleDBNull<double>(reader["blabla"]); 
 

vše funguje, jak má.

Děkuji.

Kdyby měl někdo podobný problém, přikládám adresy na MSDN, které mi pomohly k řešení:

Constraints on Type Parameters (C#)
http://msdn.microsoft.com/en-us/library/...

Nullable Types(C#):
http://msdn.microsoft.com/en-us/library/...
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.