C# - Adathalmazok olvasása a StringReader osztállyal

forráskód letöltése
Az egyes munkamenetek közötti tetszőleges mennyiségű adathalmazt elhelyezhetjük a Session objektumban eredeti formájukban, azonban olyan esetekben, amikor a behelyezett adatok karakterláncok formájában tárolódnak, akkor a fogadó oldalon is ilyen formátumban kell azokat kivennünk és feldolgoznunk. Ebben segít nekünk többek közt a System.IO névtér StringReader osztálya. Cikkünkben összefoglaljuk az osztály tulajdonságait, bemutatjuk a fent említett megvalósítást.
Mellékelt példa megnyitása előtt szükséges egy StringReaderTest nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A StringReader osztály a System.IO névtér TextReader osztályának származtatott osztálya. Arra készült, hogy segítsen a karakterláncokkal való munkában, de nem a String osztályban megtalálható lehetőségekkel. Segítségével a karakterláncokban tárolt, de nem karakterláncként felhasználandó információt dolgozhatunk fel, így képesek vagyunk a tárolt adatokat absztrakt adatszerkezetekbe tölteni. Lássuk metódusait sorban, kezdve a konstruktorával:
StringReader
Osztály: StringReader
public StringReader(
string s
);
Létrehoz egy példányt az osztályból a paraméterben megadott forrás karakterlánc alapján, annak beolvasásával.
Paraméterek
string s
A forrásul szolgáló karakterlánc.
Close
Osztály: StringReader
public override void Close();
Lezárja az adott objektumot a Dispose metódus meghívásával, annak true értékű paramétert átadva; ez után mindennemű hivatkozás az objektumra kivételt generál.
Peek
Osztály: StringReader
public override int Peek();
Az olvasás folyamatában a következő beolvasandó karakterrel tér vissza, azonban nem dolgozza fel azt. Amennyiben az olvasás eléri a forrás végét, -1-el tér vissza.
Visszatérési érték
A következő karakter, vagy –1.
Read
Osztály: StringReader
public override int Read();
A következő elérhető karakterrel tér vissza az adott forrásból.
Visszatérési érték
A beolvasott következő karakter, vagy –1, ha nem érhető el több karakter.
Read
Osztály: StringReader
public override int Read(
out char[] buffer,
int index,
int count
);
A paraméterben megadott kimeneti karaktertömbbe tölti a második paraméterben megadott pozíciótól a megadott számú karaktert.
Paraméterek
out char[] buffer
A kimeneti tároló.
int index
A kezdő pozíció.
int count
A beolvasandó karakterszám egész számként.
Visszatérési érték
A kiolvasott karakterek száma, vagy nulla, amennyiben nincs elérhető karakter, mert az aktuális pozíció a forrás végén van.
ReadLine
Osztály: StringReader
public override string ReadLine();
Beolvas egy sort a forrás karakterláncból. A karakterláncokban a „\n” vagy a „\r” karakterek jelzik egy-egy sor végét, a metódus ezek értelmezésével határozza meg az adott sor kezdetét és végét.
Visszatérési érték
A beolvasott sor.
ReadToEnd
Osztály: StringReader
public override string ReadToEnd();
A forrás karakterláncot az elejéről, vagy az aktuális pozíciótól (attól függően, hogy a Read metódussal mennyi volt már beolvasva) kezdve beolvassa a végéig.
Visszatérési érték
A beolvasott teljes vagy rész karakterlánc.
A mellékelt példában egy XML állományba mentett adathalmazt dolgozunk fel. A products.xml állomány az SQL Server ismert Northwind adatbázisának Products táblájának eredményhalmaza, annak egy nézete.
Az állományt a Web-szerveren létrehozott virtuális könyvtárhoz megadott fizikai mappában kell elhelyezni, a program ott fogja keresni.
A WebForm1.aspx lap betöltődésekor az állományt betöltjük egy DataSet objektumba, majd elhelyezzük annak tartalmát karakterláncként az alkalmazás Session objektumának egy rekeszében, a Session.SessionID értéket felhasználva kulcsként.
...
FileStream fsXml = new  FileStream(path,FileMode.Open,FileAccess.Read); 
ds1.ReadXml(fsXml);
StringWriter sw = new StringWriter();
ds1.WriteXml(sw);
Session[Session.SessionID] = sw.ToString();
...
A lap betöltődése után (amennyiben az állomány betöltése sikeres volt) egy link jelenik meg az oldalon, mellyel a WebForm2.aspx lapra juthatunk, ahol a StringReader osztály segítségével kiolvassuk az elmentett információkat.
A kiolvasott információk karakterláncok, a StringReader osztály segítségével a lánc méretét a következőképpen lehet meghatározni:
StringReader sr = new StringReader((string)(Session[Session.SessionID]));
string strCount = sr.ReadToEnd();
Label2.Text += strCount.Length.ToString();
Ekkor a beolvasott karakterlánc végén áll a képzeletbeli kurzor, így nem tudjuk az adatokat a DataSet objektumba tölteni, próba esetén kivétel keletkezik. A művelethez újra kell példányosítanunk az osztályt, és beolvasni az adatokat:
sr = null;
sr = new StringReader((string)(Session[Session.SessionID]));
ds2.ReadXml(sr);
A DataSet objektumot adatforrásként felkínáljuk egy DataGrid kontrolnak, mely a megjelenítésről gondoskodik.
dg.DataSource = ds2.Tables[0].DefaultView;
dg.DataBind();