Přetypování a DBNull   zodpovězená otázka

C#

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í?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

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/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback