DataTable ve Session İle Hızlı ve Pratik Raporlama İşlemleri

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,726
4-5 tablo üzerinde çok detaylı raporlama işlemlerinin yürütüldüğü bir sayfaya sahipsinizi düşünelim.
bu tablo üzerindeki veriler üzerinde en hızlı raporlama yöntemlerinden biri hiç kuşkusuz saklı Yordam(Stored Procedure) kullanmak ve
bu saklı yordamın içerisinde de Sql tümcelerini uzun metin (lontext veya nvarchar(max)) gibi veri türlerine çevirerek bu sql tümcesinde
kelime ekleyerek ve bu tümceyi çalıştırarak hızlı çözümler üretebiliriz. (Bkz. Execute Sql String)

Her güzel şeyin bir de kötü yanı olduğu gibi bu gibi bir ifadeyi geliştirmek biraz zaman almakta ve kod yenilemelerindede sizi zorlayabilir.
Ayrıca web tarafından gelen her talep için sql her ne kadar stored da kullansak belli bir vakit kaybını doğurmakta.

Aslında yapmamız gereken 2 nokta var eğer çok yoğun bir sorgulama yapacaksanız veya tablolar arası ilişkilendirmeniz varsa bu sorguyu bir stored procedure
altında yapmak verimi daha da artırır. Ancak Her sorguda buraya bağlanmayacağız.

Örnek Saklı Yordamımız (Stored Procedure)
Kod:
Create Procure [dbo].[spRandevulariGetir]
As
Select tb.*,
tvb.AdSoyad as VeliAdSoyad,
tvb.Adres as VeliAdres, tvb.CepTel as VeliCepTel, tvb.EvTel as VeliEvTel,
trd.Tarih,trd.Saat,trd.RandevuSebebi,tro.Okul,tro.OkulID,tro.Okul,tri.IlceID,tri.Ilce,tog.Ogretmen
	From 
	TRandevular trd 
	left Join TKimlikBilgileri tb On trd.RandevuAlanTc=tb.RandevuAlanTc
	inner Join TVeliOgrenci tvo On tvo.OgrenciID=tb.OgrenciID
	right Join TVeliBilgileri tvb On tvo.VeliID=tvb.VeliID
	left Join TRandevuOkullar tro On tro.OkulID=tb.OkulTuru
	inner join TRandevuIlceler tri on tri.IlceID=tro.IlceID
	left Join TRandevuOgretmenleri tog on tog.Ogretmen=trd.Ogretmen


Gelelim kod kısmımıza

Kod:
private DataTable RandevulariListeyeAta()
    {
        string sql = "spRandevulariGetir"
        SqlDataAdapter adp = new SqlDataAdapter(sql, ayar.Baglanti);
        DataTable dt = new DataTable();
        adp.Fill(dt);
        Session["DataTable"] = dt;
        return dt;
    }

üstteki alt rutin tek bir seferliğe mahsus çalışacak ilgili stored procedure ile gelen veriyi bir session da tutacak gerektiğinde biz sadece sessionlı kullanarak
verileri çekeceğiz.

Süz butonumuz (btnSuz) Buradaki kontrolleri açıklama gereği duymadım.

Kod:
protected void btnSuz_Click(object sender, EventArgs e)
    {
        string kriter = "OgrenciID>-1";
        DataTable dt = new DataTable();
        if (Session["DataTable"] != null)
            dt = (DataTable)Session["DataTable"];
        else
            dt = this.RandevulariListeyeAta();
        kriter = OgrenciAdSoyad.Text == "" ? kriter : kriter + " And RandevuAlan='" + OgrenciAdSoyad.Text + "'";
        kriter = OgrenciTcKimlik.Text == "" ? kriter : kriter + " And RandevuAlanTc='" + OgrenciAdSoyad.Text + "'";
        kriter = Ilce.SelectedValue == "" ? kriter : kriter + " And IlceID=" + Ilce.SelectedValue;
        kriter = Okul.SelectedValue == "" ? kriter : kriter + " And OkulID=" + Okul.SelectedValue;
        kriter = OgretmenAdSoyad.Text == "" ? kriter : kriter + " And Ogretmen Like '%" + OgretmenAdSoyad.Text + "%'";
        kriter = BaslangicTarih.Text == "" ? kriter : kriter +
            " And Tarih in (#" + Convert.ToDateTime(BaslangicTarih.Text).ToString("yyyy-MM-dd")
            + "#, #" + Convert.ToDateTime(BitisTarih.Text).ToString("yyyy-MM-dd") + "#)";
        kriter = Saat.SelectedValue == "" ? kriter : kriter + " And Saat='" + Saat.SelectedValue + "'";
        DataView dv = new DataView(dt);
        dv.RowFilter = kriter;
        gvRandevular.DataSource = dv;
        gvRandevular.DataBind();
    }



Kod:
if (Session["DataTable"] != null)
            dt = (DataTable)Session["DataTable"];
        else
            dt = this.RandevulariListeyeAta();

İşte bu kod asıl işi yapan kısım bunun sayesinde tekrar tekrar veri tabanına bağlanmıyoruz.

Aşağıdaki kodu kullanarak bir adet dataview oluşturuyoruz ve RowFilter ile yukarıda hazırladığımız kriterler doğrultusunda sorgulamaya tutuyoruz. sonrasında
gvRandevular adlı gridviewımıza bağlıyoruz.
Kod:
 DataView dv = new DataView(dt);
        dv.RowFilter = kriter;
        gvRandevular.DataSource = dv;
        gvRandevular.DataBind();

İşin Püf noktası Sql sorgunuzdan gelen verileri DataTable a aktarmak bunu da Session'a yollamak 1.den sonraki tüm sorgulamalarda veriyi Sessiondan çekmek.
 
Geri
Üst