Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Stránkovanie v ASP.NET efektívne a výkonne

Takmer v každej web aplikácii sa v dnešnej době používaju databázy a je potrebné zobrazovať nejaké zoznamy nejakých dát. Či už je to zoznam nejakých produktov, kontantov, či čohokoľvek iného tak v ASP.NET veľmi čsto siahnete po servrovom ovládacom prvku DataGrid, pretože v relatívne krátkom čase dosiahnete požadovaný výsledok s pomerne širokou funkcionalitou. Samozrejme, že takmer každé rýchle riešenie niečo stojí a v tomto prípade je to predovšetkým výkon a pamäť, pretože málo kedy máte nad sebou niekoho kto pozerá jako ste to naprogramovali takže vo väčšine prípadov sa pripojí DataAdapter ten sa nastaví ako datový zdroj ( DataSource ) ten sa naplní datami ( Fill() ) a aby sme to už nemuseli znovu robiť po PostBacku tak šup s tým do Session … doplníme Sortovanie nad DataView, stránkovanie a je to hotove za chviľku. Povieme si je to paráda a funguje to … ale zrazu našu aplikáciu naplníme datami a čo to ?? je to pomalé zaberá to enormné množstvo pamäte a zrazu je problém … ako si s týmto problémom poradiť ?? To je práve predmetom tohoto článku.

 

Takže v prvom rade je třeba povedať, že DataAdapter je príliš komplexný objekt, ktorý vo webových aplikáciach skoro nevyužijete. Mne osobne sa nepodarilo napísať aplikáciu kde by som využil a to z jednoduchých dôvodov:

-         web aplikácia by mala byť navrhnutá tak aby jednotlivé stránky boli čo najjednochšie, aby sa rýchlo natiahli ..takže čo stránka to operácia a DataAdapter zbytočne obsahuje všetky operácie nad DB, čiže Select, Update, Delete, Insert

-          z viacerých porovnaní som zistil že je práve pre načítanie udajov pomalší ako DataReader, čo sa učite dočítate aj v odbornej literatúre

 

Ďalší problém je s pamäťou .. ukladat celú sadu dat do objektu session ktorú má každý užívateľ je nehoráze plytvanie pamäťou, si zoberte že ak bude prihlásených 100 užívateľov a budú listovať v zozname 20 000 kontaktov tak mate v pamäti 100 x po 20 000 záznamov…takže čo s tým ??

 

Proste nedržať tieto údaje v session ale proste vytiahnuť z databázy iba údaje, ktoré chce užívateľ vidieť a to buďto ho prinútitť aby písal podmienky výberu, alebo využiť ďalšiu vlastnosť DataGridu a to stránkovanie a při každom Requste ( požiadavku na web server ) získať iba tie data z SQL Serveru ktoré užívateľ uvidí.

 

Takže snažil som sa napísať obecnú uloženú procedúru vid (Univerzálna stránkovacia uložená procedura) z ktorej jako prvý výsledok je celkový počet riadkov ktorým nastavíme Property ( vlastnosť ) VirtualItemCount ktorá zabezpečí že sa nám v datagride zobrazí správny počet stránok v závislosti na tom po koľkých riadkoch chceme stránkovať, čo nastavíme v property PageSize . Ďalší výsledok na ktorý sa dostaneme pomoucou metody DataReaderu NextResult() sú už požadované  data, ktoré potrebujeme zobraziť v DataGride. Keďže DataReader obsahuje interface (rozhranie) Ienumerable, ktorý požaduje Datagrid.DataSource možeme mu ho priamo priradiť bez toho aby sme data presýpavali do DataSetu resp. Do DataTable, čím dosiahneme ďalsši zrýchlenie.

 

Takže si myslím že dosť bolo objasňovania (alebo jako sa hovorí dosť bolo kecov), na ktoré ja aj tak moc nie som takže tu máme najprv zdrojový kód uloženej procedury a potom malá ukážka jako ju použiť spolu s DataGridom.

 

Celý zdrojový kód so vzorovým projektom najdete tu: WebPaging1

 

Základná helper metóda pre naplnenie DataGridu, pričom príklad je ako inak nad databázou Northwind:

 

private void BindGrid(ref DataGrid dg, int stranka,string sortovanie,object podmienky)

{

      //otvorime spojenie s DB

      this.sqlConnection1.Open();

 

      #region Nastavenie parametrov

      //nastavime tabulku/view z ktorej zobrazujeme data

      this.sqlCommand1.Parameters["@menoTabulky"].Value = "Orders";

      //nastavime ktore stplce z tabulku/view chceme zobrazit

      this.sqlCommand1.Parameters["@parametre"].Value =    " CustomerID,ShipName ";

      //zistime pocet riadkov gride ktore je nastavene v design mode

      this.sqlCommand1.Parameters["@pocetZaznamov"].Value = this.DataGrid1.PageSize;

      //nastavime stranku

      this.sqlCommand1.Parameters["@cisloStranky"].Value = stranka;

      //nastavime sortovanie

      this.sqlCommand1.Parameters["@trieditPodla"].Value = sortovanie;

      //podmienky vyberu za Where v sql dotaze

      this.sqlCommand1.Parameters["@podmienky"].Value = podmienky.ToString() ;               

 

 

      SqlDataReader reader = sqlCommand1.ExecuteReader(CommandBehavior.CloseConnection);

 

      #endregion

      reader.Read();

      //zistime celkovy pocet riadkov

      dg.VirtualItemCount = Convert.ToInt32( reader[0] );

      //precitame data

      reader.NextResult();

      //vratime reader

      dg.DataSource = reader;

     

      // nastavenie aktualnej stranky

      dg.CurrentPageIndex = stranka -1;

 

      // zobrazenie dat v datagride

      dg.DataBind();

 

      // uzavrenie readra

      reader.Close();

 

}

 

 

Posted: 25. června 2004 15:51 by rasto
Vedeno pod:

Komentář

Radim Hampel napsal:

Jen jednu malou poznamku, ktera souvisi s kodem: proc pouzivate ref klicove slovo, neni tady zbytecne?
# června 28, 2004 8:28

Rasto napsal:

No mate pravdu, sila zvyku :( budem sa to musiet odnaucit ...
# června 28, 2004 9:47
Neregistrovaní uživatele nemužou přidávat komentáře.
Vyvojar.cz na prodej!