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.