HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Adattábla lekérdezés eredményeinek tárolása a Cache-en, amíg nem módosul a tábla


Példaprogram letöltése

15092 bájt

Tegyük fel, hogy adott egy MS SQL adatbázis, melyen táblájából mindig egy-egy sor adatait kell megjeleníteni a web oldalon. Ekkor, hogy ne kelljen állandóan az adatbázishoz fordulni egy lekérdezéssel célszerű ezeket a sorokat a cache-n tárolni. Ekkor, ha szükséges egy sor megjelenítése és az már megtalálható a cache-en, akkor nem kell SQL lekérdezést futtatni. Ez módszer jelentősen gyorsíthatja programunk web oldal generálási sebességét.
Egy probléma azonban felmerül: ha változik egy olyan sor az adattáblában, mely már a cache-en is szerepel, akkor egy újabb kérés esetén a cache-n lévő régi adat jelenik meg a web lapon és nem az új, ami aktuálisan még csak az adattáblában van.

Mellékelt példa kipróbálásához szükséges egy CacheTableTest nevű virtuális könyvtár létrehozása, mely arra a könyvtárra mutat, amelybe másolta a példát. Ehhez legegyszerűbb út az adott mappa tulajdonság ablakában lévő Webmegosztás lapon található, ahol is engedélyezzük a megosztást.
Futtatás előtt szükséges még a szintén mellékelt CacheTest.sql futtatása, hogy létrejöjjön a példához szükséges SQL adatbázis.
Végső lépésként a WebForm2.aspx.cs forráskód 40. sorában lévő connStr változó értékét módosítsuk úgy, hogy programunk képes legyen az adatbázishoz kapcsolódni.
A példában két WebForm-ot használunk. Az első lapon lehet kiválasztani, hogy melyik sort is szeretnénk látni az öt meglévő közül. Választás után ez a második WebForm-on kerül megjelenítésre. Itt tájékoztatást kapunk arról is, hogy az adat SQL lekérdezés útján jött-e létre, vagy már elérhető volt a Cache-ből is.
Az első megjelenítéskor biztos, hogy lekérdezés útján jön az adat. Ha ilyenkor a Frissít gombra kattintunk, akkor megjelenik ugyanaz a tartalom, de látható lesz, hogy most már a Cache-ből jött az adat.
Ha a Változtat gombra kattintunk, akkor egy véletlenszerű értékre megválatozik a sor egyik adata. Ilyenkor ismét lekérdezés útján kapjuk az adatokat és nem a Cache-ből, így nem fordulhat elő, hogy adatváltozás esetén a régi adat jelenjen meg.
A Vissza gombot választva ismét a WebForm1-re kerülünk, itt új sort választhatunk megjelenítésre, vagy ha már van a Cache-en adat, akkor ezekről is megjelenik egy lista, melynek segítségével törölhetjük is a sorokat a Cache-ről. Ez utóbbinak az lesz a hatása, hogy a következő megjelenítéskor ismét lekérdezés útján fogjuk megkapni az adatokat.
Nézzük most minként valósíthatók meg ezek a funkciók.
WebForm1
Ha a ListBox-ból választunk egy sort, akkor az adattáblából az ezzel a számmál egyező ID értékű sort kell megjelenítenünk. Ehhez a kérést a WebForm2-höz továbbítjuk egy id=x paraméterrel, ahol x az adott sor száma lesz.
    private void Button1_Click(object sender, System.EventArgs e)
    {
      Response.Redirect("WebForm2.aspx?id=" + ListBox1.SelectedItem.Value.ToString());
    }
Ha már van adat a Cache-en, akkor kell készítenünk egy listát, melynél meg kell oldanunk a törlés lehetőségét. Ehhez azt a megoldást válasszuk, hogy nyomógombokat hozunk létre. Mindegyiknek feliratán látható lesz, hogy melyik adatról is van és a gombra történő kattintással elvégezhető a törlés is.
A Cache elemeinek az eléréséhez a GetEnumerator függvény hívásával kérünk egy IDictionaryEnumerator osztályt.
    private void Page_Load(object sender, System.EventArgs e)
    {
      IDictionaryEnumerator de = Cache.GetEnumerator();
Ezt felhasználva egy while ciklussal végig mehetünk a Cache-en tárolt összes elemen. A következő elemre való léptetést a MoveNext végzi és egyben tájékoztat is arról, hogy kell-e még folytatnunk a ciklust.
      while (de.MoveNext())
      {
Következőlépésben lekérdezzük a Cache-en tárolt adat megnevezését, amit ellenőriznünk kell, mivel a Cache-en nem csak a mi általunk tárolt adatok lehetnek. Mivel az adatokat úgy tároljuk, hogy Row1, Row2, stb. neveket adunk, így ezt felhasználva ki tudjuk szűrni a más alkalmazás által tárolt adatokat.
        s = de.Key.ToString();
        if (s.IndexOf("Row")==0)
        {
Ha találtunk egy olyan adatot, mely e feladatunkhoz tartozik, akkor létrehozunk egy új nyomógombot és beillesztjük a WebForm-on lévő Panel-re. Megadunk a Command eseményéhez egy kezelőt is. Ez akkor fog aktivizálódni, amikor a gombra kattint a felhasználó. Mivel a CommandArgument-be eltároltuk
          b = new Button();
          b.Text = s + " törlése a Cache-ből";
          b.Style.Add("top", y.ToString());
          b.CommandArgument = s;
          b.Command += new CommandEventHandler(ButtonClick);
          Panel1.Controls.Add(b);
          y+=24;
        }
      }
    }
Amikor tehát fut a ButtonClick nevű eseményünk, akkor paraméterként megkapjuk a gomb CommandArgument property-ébe beállított értéket, mely a Cache-en lévő adat megnevezés lesz. Így nincs más dolgunk, mint eltávolítani ezt a Cache-ről és újra betölteni a WebForm1-et, melyen ehhez az elemhez most már nem fog gomb tartozni.
    private void ButtonClick(object sender, System.Web.UI.WebControls.CommandEventArgs e)
    {
      Cache.Remove(e.CommandArgument.ToString());
      Response.Redirect("WebForm1.aspx");
    }
WebForm2
Amikor betöltésre kerül a lap, akkor először is el kell döntenünk, hogy a kért adat megtalálható-e a Cache-en vagy még nem. Ehhez persze tudnunk kell, hogy melyik sorról is van szó.
Ezt az ID paraméterből meghatározhatjuk, majd megpróbáljuk a kért adatot lekérni a Cache-ből. Mivel a Cache-en DataRow osztály típusban tároljuk egy-egy sor minden adatát, így egy ilyen típusú változóba tároljuk is el.
    private void Page_Load(object sender, System.EventArgs e)
    {      
      string sid = Request.QueryString["id"];
      dr  = (DataRow)Cache["Row" + sid];
Ha a Cache-ről visszaadott adat null értékű, akkor még nem áll rendelkezésre a Cache-en a kért sor. Ez esetben futtatjuk az SQL lekérdezést.
      if (dr == null) 
      {
        SqlConnection connection = new SqlConnection(connStr);
        connection.Open();
        SqlDataAdapter da = new SqlDataAdapter("select * from testtable where id=" + sid, connection);
        DataSet ds = new DataSet();
        da.Fill(ds);
A lekérdezés eredményét ugyanabba a DataRow típusú változóba helyezzük el. Mivel példánkból következik, hogy minden lekérdezés csak egy sort ad vissza, így nyugodtan használhatjuk a Rows-nál a nulladik elemet.
        dr = ds.Tables[0].Rows[0];
        connection.Close();
A lekérdezés után tároljuk is a sort a Cache-en, hogy a következő kéréskor már onnan legyen elérhető.
        Cache["Row" + sid] = dr;
        Label1.Text = "Az adatok lekérdezés útján érhetők el.";
      }      
      else
      {
        Label1.Text = "Az adatok a cache-ből érhetők el.";
      }         
Ezen a ponton, akár a Cache-ből, akár az SQL lekérdezés útján, de valahogy biztosan rendelkezésre állnak már az adatok a DataRow osztályban, így nincs más teendőnk, mint ezeket megjeleníteni.
      Label2.Text = dr["id"].ToString();
      Label3.Text = dr["value1"].ToString();
      ...
    }
Nézzük most mit kell tennünk akkor, ha változik egy-egy sor valamely eleme.
    private void Button2_Click(object sender, System.EventArgs e)
    {
      ... 
      SqlCommand c = new SqlCommand("UPDATE TestTable SET value4 = " + r.Next(Int32.MaxValue).ToString() + "WHERE id = " + sid, connection);
      c.ExecuteNonQuery();
Miután a szükséges módon elvégeztük az adatmódosítást a tábla megfelelő során, nincs más tennivalónk, mint törölni a Cache-en esetlegesen már tárolt adatot. Ez biztosítani fogja azt, hogy amikor a következő elérésre kerül a sor, akkor egy újabb SQL lekérdezés útján lesz csak elérhető az adat, ez pedig azt garantálja, hogy a Cache-en tárolt régebbi adat már nem kerülhet megjelenítésre.
      Cache.Remove("Row" + sid);
      Response.Redirect("WebForm2.aspx?id="+sid);
    }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 393. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |