Dynamic DataRow

Azt hiszem nem én vagyok az egyetlen, akit a C# 4-ben bevezetett dynamic kulcsszó első hallásra teljesen hidegen hagyott. Meg másodikra és harmadikra is. Hiszen száz évben egyszer van (vagy egyszer sincs) szükség arra, hogy .NET-ből COM-ot hívjak, Office-t automatizáljak, Pythonnal és Ruby-val meg aztán végképp nem játszom – márpedig az összes (new Calc-nál bonyolultabb) példa ezekről szól. De azért csak találtam olyan esetet, ahol kifejezetten bevált a dynamic. Nem azért, mert nem lehetne máshogy, hanem azért, mert így rövidebb lesz a kód.

Ez az ominózus eset pedig a DataRow objektumból történő adatolvasás. Az sem túl szép, hogy row["oszlopnév"], de onnan kezdve, hogy nem objectre, hanem stringre, intre vagy boolra van szükségünk és kasztolgatni kell, kifejezetten terjedelmessé és barátságtalanná tud válni a kód. Ezen segíthet az alábbi osztály:

public class DynamicDataRow : DynamicObject
{
    private readonly DataRow row;

    public DynamicDataRow( DataRow row )
    {
        this.row = row;
    }

    public override bool TryGetMember( GetMemberBinder binder, 
out object result ) { object rawValue = this.row[ binder.Name ]; result = rawValue is DBNull ? null : rawValue; return true; } public override bool TrySetMember( SetMemberBinder binder,
object value ) { this.row[ binder.Name ] = value; return true; } }

Ha van egy ilyen osztályunk, akkor sokkal egyszerűbben férhetünk hozzá típusosan egy DataRow objektum tartalmához:

DynamicDataRow r = new DynamicDataRow( row );
bool b = r.BoolOszlop;

Amire érdemes figyelni:

  • A TryGetMemberbe szándékosan került egy olyan rész, ami kezeli azt az esetet, amikor az adatbázisból NULL érték jön vissza például string helyett. Ilyenkor ugyanis a dynamic DBNull típusra alakítaná és máris nem tudnánk olyat leírni, hogy String.IsNullOrEmpty(r.Oszlop).
  • A másik, hogy a Nullable típusok meg tudják ám zavarni a dynamicot. Ha ő azt látja, hogy egy oszlop egész számot tartalmaz, akkor ő azt intre fogja alakítani. Azt már ő nem fogja tudni, hogy az az oszlop néha lehet NULL is, amit egyébként egészen jól lehetne kezelni int? típusként is. Ha a kódodban később van egy null vizsgálat, ami int?-re jól működik, egyáltalán nem biztos, hogy dynamicra is jól fog működni, például mert a dynamicban lévő intnek nincs HasValue tulajdonsága.
Technorati-címkék: ,,

3 thoughts on “Dynamic DataRow

  1. Novák István

    A legtöbben pont ezért használjuk — az általad leírthoz hasonló kontextusban –, mert gyakran rövidebb lesz tőle a kód🙂

  2. gubijo

    Ahogy én se a varozást meg a razort, első ránézésre🙂 Úgy látszik a fejlődéssel bejönnek ilyen nem túl népszerű dolgok. A rowozást pont elkövettem a legutolsó postomban😦

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s