Ana Sayfa » Ders Notları ve Örnekler » ASP.NET » Veritabanından Kayıt Listeleme

Uyarılar :
  • Bu sayfada yazılanlar yeniden yayınlanamaz.
  • Bu örnek ders sırasındaki anlatımlardan derlenmiştir. Özellikle bir makale şeklinde yazılmamıştır. Bilgilerde eksiklikler bulunabilir.
  • Bu örneği çalıştırabilmek için sitenizin ana dizininde "App_Data" isimli bir klasörün içinde "Veriler.mdb" isimli bir Access veritabanı dosyası bulunmalıdır. Veritabanında "Adi", "Soyadi" ve "Mesaji" alanlarını içeren "Mesajlar" isimli bir tablo bulunmalıdır.
  • Örneği MS SQL Server veritabanıyla kullanabilmek için System.Data.OleDb isim alanı yerine System.Data.SqlClient isim alanının, OleDbConnection sınıfı yerine SqlConnection sınıfını, OleDbCommand sınıfı yerine SqlCommand sınıfını, OleDbDataReader sınıfı yerine SqlDataReader sınıfını kullanınız.

Burada düşük seviyede kayıt listeleme anlatılacaktır. Kayıt listeleme için Repeater, DataList gibi özel ve yetenekli web kontrolleri yerine, listelemenin temel mantığını kavratmak amacıyla sadece bir Literal web kontrolü kullanılmış ve veritabanından okunan metinler bu kontrolün Text özelliğine atanarak görüntülenmiştir.

<%@ Page Language="C#" Debug="True" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
    void Page_Load(Object o, EventArgs e)
    {
        OleDbConnection Baglanti;
        Baglanti = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" +
                   Server.MapPath("~\App_Data\Veriler.mdb"));
        OleDbCommand Komut;
        Komut = new OleDbCommand("SELECT * FROM Mesajlar", Baglanti);
        OleDbDataReader Okuyucu;
        Baglanti.Open();
        Okuyucu = Komut.ExecuteReader();
        while (Okuyucu.Read())
        {
            ltMetin.Text += Okuyucu["Adi"].ToString() + " " +
                            Okuyucu["Soyadi"].ToString() + " " +
                            Okuyucu["Mesaji"].ToString() + "<hr>";
        }
        Baglanti.Close();
        ltMetin.Text += "Listeleme tamamlandı...";
    }
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Deneme</title>
</head>
<body>
    <form id="form1" runat="server">
	<asp:Literal id="ltMetin" runat="server" EnableViewState="false" />
    </form>
</body>
</html>
        <%@ Page Language="C#" Debug="True" %>

Burası sayfa bildirimlerinin yapıldığı yerdir. Sayfa bildirimleri ASP.NET form sayfasının en üstündedir ve "<% Page" ifadesi ile başlar. Bu kısımda bizim şimdilik kullandığımız gibi sayfada kullanacağımız programlama dili (Örneğimizde C#), sayfadaki hataların görünüp görünmeyeceği (Debug="True" ifadesi) gibi bazı bildirimleri yaparız.

        <%@ Import Namespace="System.Data" %>
        <%@ Import Namespace="System.Data.OleDb" %>

Bu kısımda sayfamızda kullanacağımız veritabanı yönetim sınıflarının (bağlantı kurmak, komut çalıştırmak, kayıtları gezmek vb.) bulunduğu isim alanlarını bildiriyoruz. Bizim örneğimizde Access veritabanı kullanılmıştır. Eğer MS SQL Server veritabanı kullanılacaksa bu bildirimler;

        <%@ Import Namespace="System.Data" %>
        <%@ Import Namespace="System.Data.SqlClient" %>

şeklinde olacaktır.

OleDbConnection sınıfı, Access veritabanlarına bağlantı sağlayan sınıftır. Aşağıda OleDbConnection türünden bir değişken tanımlanıyor...

    <script runat="server">

Bu ifade sunucu tarafından çalıştırılacak olan kodların başladığını bildirir.

    void Page_Load(Object o, EventArgs e)
    {

Page_Load yordamı bildiriliyor. Bu yordam (prosedür) ASP.NET form sayfası her istendiğinde çalıştırılır. Biz de sayfa istendiğinde yapılacak ilk işlemleri genellikle bu yordamın içinde programlarız.

OleDbConnection sınıfı, Access veritabanlarına bağlantı sağlayan sınıftır. Aşağıda OleDbConnection türünden bir değişken tanımlanıyor...

        OleDbConnection Baglanti;

Bağlantı sınıfının bir örneğini (nesne) oluşturmak için new operatörü ile bu sınıfın yapılandırıcısını çağırırız. Yapılandırıcının (OleDbConnection("Provider=Mic...") ifadesi) bir kaç kullanım çeşidi vardır. Bunlardan en çok tercih edilen şekil aşağıdaki gibi yapılandırıcı ile bağlantı dizesini (Connection String) bildirmektir. Bağlantı dizesi, veritabanına ulaşmak için kullanılacak bilgileri içerir. Bu bilgiler en sade haliyle bu veritabanına erişim için hangi veritabanı hizmet programının / sürücüsünün kullanılacağı (Örneğimizde Microsoft.Jet.OleDb.4.0) ve veritabanı dosyamızın tam yolu ve adıdır. Farklı veritabanı türlerinde (MySql, SQLServer vs.) bağlantı dizesi ifadesi farklıdır. (Bağlanti dizeleri hakkında geniş bilgi için connectionstrings.com sitesine bakınız.)

Alttaki Server sınıfının MapPath metodu, verilen göreceli adresin (bu sayfanın bulunduğu yere / klasöre göre verilen adresin, örneğin "App_Data" -Bu klasördeki App_Data klasörü- veya "..\abc.txt" -bu klasörün bir üst klasöründeki abc.txt dosyası-) mutlak adresini (bu adresin tam olarak hangi sürücünün hangi klasöründe bulunduğu, Windows İşletim Sisteminde C:\KlasorAdi\DosyaAdi.Uzantisi şeklinde bir adres) döndürür. Bağlantı dizesinde veritabanı dosyasının tam yolunu ve adını vermek gerektiğinde en çok bu yolu tercih ederiz. Çünkü, web sitemizin sunucuda bulunduğu adres bize bağlı olmayan sebeplerle değişebilir. Mutlak adresi vermek yerine mutlak adresi bu şekilde tespit etmek her zaman daha doğru bir işlemdir. ~/App_Data/Veriler.mdb yolundaki ~ (tilde) işareti web sitemizin ana dizinine işaret eder. Sunucu bu işareti sitemizin ana dizini olarak kabul edecek ve çevirecektir. MS SQL Server, MySQL gibi veritabanı hizmet programları kullanılıyorsa çoğunlukla veritabanı sunucusunun adı ve veritabanımızın adı kullanıldığından bu tür bir yol bildirimi kullanılmaz. Ancak veritabanı dosyamız, Access veya SQL Server MDF dosyası gibi tek dosya halinde ise her zaman yolu bildirmeliyiz.

            Baglanti = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" +
                   Server.MapPath("~\App_Data\Veriler.mdb"));

OleDbCommand sınıfı, veritabanı üzerinde çalıştırılacak SQL dili sorgu ifadelerinin / komutlarının çalıştırılması ve sonuçlarının alınması için kullanılan sınıftır.

        OleDbCommand Komut;

OleDbCommand sınıfını kullanabilmek için bir örneğini (nesne) oluşturuyoruz... OleDbCommand nesnesi birkaç farklı şekilde oluşturulabilir. En çok kullanılan aşağıdaki gibi 1. parametre olarak veritabanı üzerinde çalıştırılacak SQL komutlarını, 2. parametre olarak bu işleme hangi bağlantının aracılık edeceğini bildirdiğimiz şeklidir. Örneğimizdeki "SELECT * FROM Mesajlar" ifadesi (SQL Sorgusu / Komutları) veritabanı dosyamızdaki (Veriler.mdb) "Mesajlar" isimli tablodaki bütün kayıtların seçilerek yükleneceğini belirten temel SQL dili kalıplarından birisidir. Bu sayfa örneğimizde kayıtları çıktıya listeleyeceğimiz için bu şekilde kayıt çekmek için bir SQL sorgusu kullanılmıştır.

            Komut = new OleDbCommand("SELECT * FROM Mesajlar", Baglanti);

OleDbDataReader türünden bir değişken tanımlıyoruz. OleDbDataReader sınıfı OleDbCommand sınıfı ile çekilen tutan ve bu kayıtlar üzerinde ileriye doğru okuma imkanı veren sınıftır...

        OleDbDataReader Okuyucu;

Bağlantıyı kullanmadan hemen önce açıyoruz. Her açık bağlantı hafızada belli bir miktar yer kullanır. Sitemizde aynı anda binlerce ziyaretçi bulunabileceğinden ve bu sayfayı çağıran her ziyaretçi bu miktar hafızayı ayrı ayrı kullanacağından sunucuya yük olmamak için bağlantılar ihtiyaç olduğunda açılmalı ve işimiz bittiğinde hemen kapatılmalıdır (ASP.NET'in web sitelerindeki açık bağlantıları yöneten ve bu bağlantıların yükünü asgariye indirmek için hazırlanmış "bağlantı havuzu" adı verilen bir önlemi mevcuttur. Bağlantı havuzu, aynı bağlantı dizesini (Connection String) içeren bağlantılar için tek bir bağlantı kullanarak bu yükü asgariye indirmeye çalışır. Bu konunun ayrıca incelenmesi gerekir).

        Baglanti.Open();

OleDbCommand sınıfının çalıştırılması için (tanımlama sırasında kullandığımız SQL komutlarının çalıştırılması için) ExecuteReader, ExecuteNonQuery ve ExecuteScalar metodları kullanılır. Bunlardan ExecuteReader metodu, OleDbCommand nesnesi (Örneğimizde Komut değişkeni) bir SQL SELECT komutu içerdiğinde / çalıştıracağı zaman, SELECT komutunun döndürdüğü kayıtları bir OleDbDataReader nesnesi (olarak) döndürür. Bu yüzden Komut.ExecuteReader() ifadesi ile bize dönen OleDbDataReader nesnesini bizim tanımladığımız Okuyucu isimli değişkene atıyoruz (dolayısıyla new operatörü ile OleDbDataReader'in bir örneğini - new OleDbDataReader(... -oluşturmamız gerekmiyor).

        Okuyucu = Komut.ExecuteReader();

OleDbDataReader sınıfının Read metodu her çağırıldığında OleDbDataReader'ın tuttuğu sıradaki bir kaydı okur / kayda konumlanır ve kayıt okuyabildi ise True, okuyamadı ise (kayıt yok veya tümkayıtlar okunduysa) False döndürür. Genellikle aşağıdaki gibi bir While döngüsü kullanılarak okuma işlemi gerçekleştirilir. Okuyucu.Read, True döndürdüğü sürece döngü devam eder ve her seferinde bir sonraki kayda konumlanarak Okuyucu.Read False döndürene (kayıtlar bitinceye) kadar döngü devam eder. Read metodunun (dolayısıyla OleDbDataReader'in) önemli bir özelliği bir sonraki kaydı okuduğunda önceki kaydı hafızadan silmesidir. Bu şekilde okunan kayıtlar hemen hafızadan atılarak hafızadan tasarruf sağlanır. Bu durum bize sadece ileriye doğru okuma imkanı verir. Web sunucularında kayıtları hafızada tutmak yerine özellikle listeleme yapılacaksa kayıtları bir an önce hafızadan atmak en çok kullanılan ve doğru olan yöntemdir.

OleDbDataReader, bir kayda konumlandığında kaydın alanlarının (sütunlar) değerlerine ulaşmak için OleDbDataReader türünden değişkenin adı ve parantez içinde alan adı yazılır. Örneğin aşağıdaki Okuyucu("Adi") ifadesi konumlanılan kaydın "Adi" isimli alanın değerini verir. (Örneğimizde çıktı bir Literal web kontrolünün Text özelliğine yazılmaktadır. Okunan kayıtların düzenli ve kolay bir şekilde görüntülenmesi için Repeater, DataGrid ve DataList gibi kontrolleri kullanılabilir. Bu konu ayrıca incelenmelidir.)

        while (Okuyucu.Read())
            {
            ltMetin.Text += Okuyucu["Adi"].ToString() + " " +
                            Okuyucu["Soyadi"].ToString() + " " +
                            Okuyucu["Mesaji"].ToString() + "<hr>";
            }

Yukarıda anlatıldığı gibi bağlantılar işimiz bittiğinde hemen kapatılmalıdır.

        Baglanti.Close();

Örneğimizde mümkün olduğu kadar az bilgi kullanılarak anlatım yapılabilmesi için bazı konular gözardı edilmiştir. Bu konular daha sonraki derslerde işlenecektir. Ancak önemli olduğundan bir konuya burada değinelim. Metinleri birbirine bir çok kez eklemek çok tercih edilen bir yol değildir (Üstteki ltMetin.Text += ... gibi). Çünkü .NET programlama dilleri ve sınıf kütüphanesi tamamen nesneye dayalıdır. Hafızada sadece içerdiği harf kadar yer tutan ilkel değişkenler yerine her biri bir sınıf olan değişkenler kullanılır. Bu durum string, int, float gibi tüm veri tipleri için geçerlidir. Bunların her biri bir sınıf olduğundan üstteki gibi + ile birleştirme yapılan stringler derleyici tarafından String sınıfının Concat metodu ile birleştirilecektir. Dolayısıyla her string eklemesi bir çok yeni string nesnesi oluşturacaktır. Bu da her bir ziyaretçinin binlerce nesne oluşturması anlamına gelir ki, bu özellikle bir çok kişinin aynı işlemi yaptığı web sunucuları için istenmeyen bir durumdur. Bu tür birleştirme yerine StringBuilder sınıfı kullanılabilir. Bu sınıf, kendisine metin eklendiğinde yeni bir nesne oluşturmak yerine hafızada önceden sizin eklemelerinize göre ayırdığı yere ekleneni yazar. Böylece her metin eklenmesinde yeni sınıflar oluşturulmaz ve ekleme işlemleri hızlanmış olur. Tüm eklemeler bittiğinde StringBuilder sınıfının ToString metodu ile metnin son hali elde edilerek istenen yerde kullanılabilir.

İletişim : hazirsite@gmail.com