
A példa kipróbálásához a ServerName, LoginName és Password ablakokba adja meg a szükséges adatokat, mellyel képes egy SQL szerverhez kapcsolódni. A mellékelt példához a Northwind példa adatbázist használjuk.
Az adatbázis kapcsolathoz egy SqlConnection osztályt használunk. A kapcsolat megnyitása után egy SqlQLCommand osztállyal futtatunk egy egyszerű select * from tablename lekérdezést, ahol a tablename értéke az aktuálisan kiválasztott elem a ListBox-ból.
Amikor e select-et futtatni szeretnénk az SqlCommand osztállyal, akkor annak ExecuteReader függvényét használjuk, mely egy SqlDataReader osztályt ad vissza.
SqlDataReader dr = command.ExecuteReader();
Miután az ExecuteReader lefutott, akkor felhasználva az SQLDataReader osztály példányát képesek leszünk a lekérdezés eredményét kiolvasni.
Mellékelt példában feltöltünk egy ListView komponenst a kapott eredmény halmazzal. Ehhez első lépésként a táblázat fejlécét kell létrehozni, ami attól függ, hogy a lekérdezés eredményének hány oszlopa van. Ehhez egy ciklusra van szükségünk, mely végigmegy az első oszloptól az utolsóig. Az SqlDataReader osztály FieldCount property-éből megtudhatjuk, hogy hány oszlop van. Az eredmény mezőinek nevét a GetName függvény szolgáltatja, míg azok típusát a GetDataTypeName függvénnyel tudhatjuk meg. Mindkét függvény egy int paramétert vár, mellyel azt közöljük, hogy hányadik oszlop adataira vagyunk kíváncsiak.
for (int i = 0; i < dr.FieldCount-1; i++)
{
listView1.Columns.Add(dr.GetName(i)+" ["+dr.GetDataTypeName(i)+"]", 100, HorizontalAlignment.Left);
}
Ezek után elkezdhetjük az egyes rekordok kiolvasását. Ehhez egy while ciklust használunk. A ciklus addig tart, amíg minden rekordot ki nem olvastunk. Az SQLDataReader Read függvényét hívva, mindig a soron következő rekord adatait érhetjük el. A Read igaz értékkel tér vissza, ha még van olyan rekord melyet nem olvastunk. Ezt egyébként a HasMoreRows logikai típusú property vizsgálatával is eldönthetnénk.
A cikluson belül a GetValues függvényt felhasználva kiolvassuk az adott rekord összes értékét egy object típusú tömbbe. Ennek a tömbnek minden eleme az adott rekord egy-egy mezőjét fogja tartalmazni. Lehetőségünk van arra is, hogy ne az összes, hanem csupán egy, általunk megadott mező értékét olvassuk. Ez esetben a GetValue függvényt kell használnunk. Itt paraméterként a kiolvasandó mező indexét kell megadni, valamint egy object típusú változót, melyben az adott mezőt kapjuk vissza.
Következő lépésként egy ciklust kezdeményezünk, mely a második mezőtől az utolsóig megy. Ebben a ciklusban állítjuk elő azt a sztring tömböt, pontosabban annak tartalmát, melyre majd a ListView komponens új elemének felvételekor lesz szükségünk. Mivel e komponensnél a Report nézetnél a SubItems-be adhatjuk meg a táblázatunk egyes értékeit, így ehhez először egy sztring tömböt kell feltöltenünk. A ciklust azért kezdjük a második mezőtől, mert az első mező értéke lesz a majd a ListView elemének értéke.
for (int i = 0; i < dr.FieldCount-1; i++)
{
Az SQLDataReader osztály IsNull függvényével ellenőrizhetjük, hogy az adott mező tartalmaz-e értékes adatot vagy sem. Amennyiben a függvény igaz értéket ad vissza, akkor az adott mező nem tartalmaz értéket.
if (dr.IsDbNull(i))
{
s[i] = "------------";
}
else
{
s[i] = val[i].ToString();
}
Végül már csak annyi a teendő, hogy az új rekordot hozzáadjuk a ListView komponenshez.
}
listView1.Items.Add(new ListViewItem(s));
}
Utolsó lépésként pedig le kell zárnunk a Close függvény hívásával az SQLDataReader-t