SQL Server 2005 ile gelen ROW_NUMBER() fonksiyonu ile SQL Server üzerinde sayfalama yapmak artik çok kolay. ROW_NUMBER() fonksiyonu bize kayitlarimizin yaninda bir satir numarasi olusturur ve sayfalamamiz ve indexlememiz için bize yardimci olur.
Row_Number() Kullanimi:
select top 10 row_number() over (order by name asc) as SatýrNO, ProductID, Name,ProductNumber
from Production.Product

Gördügümüz gibi bize geriye satir no isimli bir field döndürüyor ve 1 den artarak bize satir numarasi olusturuyor.
Bu özellikle windows uygulamalari için güzel bir çözüm oldu. Web uygulamarinda pagingleme oldukça basitti ama onunda dezavantajlari vardi. Özellikle çok fazla kayit içeren data datagride yüklendiginde tüm veri hem gride yüklenirken oldukça zorlaniyordu hemde sayfalar arasinda gezinirken veri tekrar tekrar yükleniyordu.
SQL server ile gelen ROW_NUMBER() fonksiyonu ile bize identity gibi artan bir satir numarasi döner ve biz bu satir numarasi üzerinde istedigimiz değerleri gönderir istedigimiz kadar kaydi görüntüleyebiliriz. Yani grid üzerinde kaç kayit görüntülemek istersek o kadar kayit gride yüklenecek. Buda inanilmaz bir performans kazanci olacak.
Örnek:
select * from (select row_number() over (order by name asc) as SatirNo, ProductID, Name,ProductNumber
from Production.Product) Products
where (SatirNo between 20 and 30)

Gördügümüz gibi bize 20 ve 30 satir numarasi arasindaki kayitlar geri döndü.
Artik örnegimize geçebiliriz.
Yeni bir web site açalim ve bir grid ekleyelim. Gridimizi ekledikten ve pagin içinde bir label ekleyelim. Grid üzerinde 10 kayit görüntüleyecegiz ve diger kayitlara geçmek için olusturacagimiz paging ile diger sayfalardaki kayitlara geçecegiz.
Not: Ayni işlemi Datalist ve Repeater ile de yapabiliriz. Ben anlasilir olmasi için Gridview üzerinde yapacagim.

Kodumuzu yazmaya baslayalim; ilk olarak connection stringi ayarlayalim.
SqlConnection Cnn;
SqlCommand Cmd;
DataSet Ds;
SqlDataAdapter Da;
private string CnnStr() // Connection Stringi ayarladik
{
return "Data Source=*******;initial Catalog=*******;Uid=*******;pwd=*******";
}
Connection Stringimizi olusturduk, simdi de Datayi çekecek olacak void’i yazalim.
private void DatayiGetir(int Start, int End) // Görüntülenecek datayi çektik..
{
Cnn = new SqlConnection(CnnStr());
string sqlstr = "select * from (select row_number() over (order by InsertionDate asc) as SatirNo, InsertionDate, UpdateDate from Messages) Messages where (SatirNo between " + Start + " and " + End + ")";
Da = new SqlDataAdapter(sqlstr, Cnn);
Ds = new DataSet();
Da.Fill(Ds, "tbl");
GridView1.DataSource = Ds.Tables[0];
GridView1.DataBind();
}.
Voidimizi yazdiktan sonra simdi de sayfamizdaki paginglemeyi ayarlayalim. Bunun için öncelikle ihtiyacimiz olan Toplam kayit sayisidir. Buradan sayfalanacak olan sayfa sayisini bulacagiz.
private int KayitSayisi() // Sayfalama için Toplam kayit sayisini aldik.
{
Cnn = new SqlConnection(CnnStr());
string sqlstr = "select Count(*) from Messages";
if (Cnn.State == ConnectionState.Closed) Cnn.Open();
Cmd = new SqlCommand(sqlstr,Cnn);
int recordCount= (int)Cmd.ExecuteScalar();
return recordCount;
}
Toplam kayit sayisini aldiktan sonra simdi Sayfa sayisini bulalim ve pagini ekrana basalim.
private void PagingiOlustur()
{
int ToplamSayfaSayisi;
StringBuilder sb = new StringBuilder();
if (KayitSayisi() % 10 == 0)
{
ToplamSayfaSayisi = KayitSayisi() / 10;
}
else
{
ToplamSayfaSayisi = KayitSayisi() / 10 + 1;
}
for (int i = 0; i < ToplamSayfaSayisi; i++)
{
sb.Append("<a href=SQLPagingAndCustomDataGrid.aspx?Sayfa=" + +(i) + ">" + (i + 1) + "</a>\n");
}
Label1.Text = sb.ToString();
}
Pagingimizi olusturduktan sonra artik paging işleminin çalismasi için Formumuzun loadinda Datayi getirecek vodidi ve paging olusturacak voidi çagiralim.
private int SayfaNo, Baslangic, Bitis;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Request.QueryString["Sayfa"] != null)
{
SayfaNo = Convert.ToInt32(Request.QueryString["Sayfa"]);
}
else
{
SayfaNo = 0;
}
Baslangic=(SayfaNo *10) + 1;
Bitis = Baslangic + 10 -1;
PagingiOlustur();
DatayiGetir(Baslangic,Bitis);
}
}
Simdi Projemizi çalistiralim;

Satir numaralarina dikkat ederseniz 1 den 10 a kadar devam ediyor. 2. sayfaya geçelim.

Yine satir numaralarina dikkat edersek 10 dan 20 ye kadar yani 2. sayfadaki kayitlari gösteriyor. Gerçekten çok hizli : )
Sizde uyguladiginizda datanin gridview ile paginglenmesine göre daha performansli oldugunu göreceksiniz.
Bu makalenin de sonuna geldik, baska bir makalede görüşmek üzere başarı ve iyi günler dilerim.
Sem GÖKSU
MCP | MCAD.NET | MCTS
Örnek Kodlar için mail adresimi kullanabilirsiniz
askisem@hotmail.com
Kaynaklar
http://msdn.com