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>