Ana Sayfa » Ders Notları ve Örnekler » ASP.NET » En Temel Seviyede Veritabanı Erişim Sınıfları

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 kullanabilmek için, web sitenizin (site klasörünüzün) ana dizininde App_Data isimli bir klasör ve bu klasörde Veriler.mdb isimli bir Access veritabanı dosyası bulunmalı, veritabanı dosyası içinde birincil anahtar olarak "Kimlik", "Adi", "Soyadi" ve "Borcu" isimli alanları içeren "Alacaklar" isimli bir tablo bulunmalıdır.

Alttaki örnekte veritabanına erişim için kullanılan 3 temel sınıf toplu olarak açıklanmıştır. Örnek olarak Access veritabanı dosyası kullanılmıştır.

Access veritabanlarını kullanabilmek için gerekli olan isim alanları örneğin üstünde (Import yazan bölüm) bildirilmiştir. Bu isim alanları "System.Data" ve "System.Data.OleDb" isim alanlarıdır. Eğer veritabanı olarak MS SQL Server kullanılacak ise "System.Data.OleDb" yerine "System.Data.SqlClient" kullanılır.

Kullanılan 3 temel sınıf, veritabanına bağlantı kurmak için kullanacağımız OleDbConnection, veritabanına kurulan bağlantı yoluyla SQL komutlarını gönderip, çalıştırıp, sonuçlarını almak için kullanacağımız OleDbCommand ve eğer veritabanından bir kayıt kümesi istediysek, bu kayıt kümesini hafızada tutmak ve sıralı okumak için kullanacağımız OlDbDataReader sınıflarıdır.

Eğer Access yerine Ms SQL Server veritabanı kullanılıyorsa bu sınıflar sırasıyla SqlConnection, SqlCommand ve SqlDataReader'dir.

Örnek :

<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>

<script runat="server">
   
    void Page_Load(Object o, EventArgs e)
	{
        Dim Baglanti As OleDbConnection;
        Baglanti = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" +
				    Server.MapPath("~\App_Data\Veriler.mdb"));
        OleDbCommand Komut;
        Komut = new OleDbCommand("SELECT * FROM Alacaklar", Baglanti);
        OleDbDataReader Okuyucu;
        Baglanti.Open();
        Okuyucu = Komut.ExecuteReader();
        while (Okuyucu.Read())
        {
            Response.Write(Okuyucu["Adi"] + " " + Okuyucu["Soyadi"] + " " + Okuyucu["Borcu"] + "<hr>");
        }
        Baglanti.Close();
        Response.Write("Kayıtların okunması bitti...");
    }
    
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Deneme</title>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>

Açıklamalar :

<%@ Page Language="VB" Debug="true" %>

Veritabanı sınıflarını kullanabilmek için bu sınıfların içinde bulunduğu aşağıdaki isim alanlarını burada bildirmeliyiz. System.Data isim alanı veritabanı erişimi ve işlemleri için genel ve ortak sınıfların bulunduğu isim alanıdır. System.Data.OleDb isim alanı ise Access veritabanı türlerine erişim ve işlem yapmak için kullanılan sınıfları içerir. Veritabanı türüne göre System.Data.OleDb tanımlaması değişir. Örneğin Microsoft SQL Server veritabanını kullanabilmek için bu veritabanına erişim için gerekli sınıfları içeren System.Data.SqlClient isim alanını bildirmek gerekir.

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

<script runat="server">
   
    void Page_Load(Object o, EventArgs e)
	{

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...

        Dim Baglanti As OleDbConnection;

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 / hizmetinin 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. 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) 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.

        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 Alacaklar" ifadesi (SQL Sorgusu / Komutları) veritabanı dosyamızdaki (veriler.mdb) "Alacaklar" isimli tablodaki bütün kayıtların seçilerek hafızaya 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 Alacaklar", Baglanti);

OleDbDataReader türünden bir değişken tanımlıyoruz. OleDbDataReader sınıfı OleDbCommand sınıfı ile çekilen kayıtları 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 (20-30KB) 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üm kayı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.

        while (Okuyucu.Read())
        {

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 köşeli 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ı Response.Write metodu kullanılarak en basit şekilde yapı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.)

            Response.Write(Okuyucu["Adi"] + " " + Okuyucu["Soyadi"] + " " + Okuyucu["Borcu"] + "<hr>");
        }

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

        Baglanti.Close();
        Response.Write("Kayıtların okunması bitti...");
    }
    
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Deneme</title>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>
İletişim : hazirsite@gmail.com