İleri Web Programlama

advertisement
SAKARYA ÜNİVERSİTESİ
İleri Web Programlama
Hafta 11
Prof. Dr. Ümit KOCABIÇAK
Bu ders içeriğinin basım, yayım ve satış hakları Sakarya Üniversitesi’ne aittir. "Uzaktan Öğretim" tekniğine uygun olarak hazırlanan
bu ders içeriğinin bütün hakları saklıdır. İlgili kuruluştan izin almadan ders içeriğinin tümü ya da bölümleri mekanik, elektronik,
fotokopi, manyetik kayıt veya başka şekillerde çoğaltılamaz, basılamaz ve dağıtılamaz.
Her hakkı saklıdır © 2009 Sakarya Üniversitesi
Veritabanı ve ADO.NET
Veritabanı bir dosyada elektronik olarak depolanmış düzenli bilgi kümeleridir. Microsoft Access, MySQL,
Oracle, DB2 ve SQL Server gibi çeşitli veritabanı programları kullanılarak güçlü veritabanları oluşturulabilir.
Veritabanı uygulaması, bir veritabanının alan ve kayıtlarını alarak bunları kullanıcılar için anlamlı bir biçimde
görüntüleyen bir programdır. Kayıtları aramak, silmek, yazdırmak, eklemek bir veritabanı uygulamasının
temel komutlarıdır.
Elimizdeki bilgileri çeşitli bilgi kanallarından kolayca aktarabilmeli ve bu kanallardan istediğimiz bilgileri
alabilmeliyiz. İşlerimizde ve günlük yaşantımızda interneti çok sık kullanmaktayız. Bilgilerimiz internet
üzerinden text olarak gidip geliyor. Tüm bu gelişmeler sonunda verilerimiz için ortak bir tanımlama dili
oluşturuldu. Bu dil hepimizin bildiği gibi XML.
İnternet ortamındaki bu gelişmelerden sonra Microsoft kendi veri erişimini endüstri standartlarına uygun ve
internet ortamına kolay taşınabilir bir şekilde değiştirdi ve ADO.NET ortaya çıktı. ADO.NET veri iletişimi
üzerinde veriler XML olarak tutuluyor.
ADO.NET, OLEDB uyumlu veritabanları (Access, Oracle, FoxPro vs.), SQL Server veritabanları, ilişkisel
olmayan veritabanları ve XML belgeleri de olmak üzere birçok veri dosyasına erişim sağlar.
Temel SQL Komutları
SQL (Structured Query Language) kendisi bir programlama dili olmamasına rağmen bir çok kişi tarafından
programlama dili olarak bilinir. SQL herhangi bir veri tabanı ortamında kullanılan bir alt dildir. SQL ile
yalnızca veri tabanı üzerinde işlem yapabiliriz. SQL cümlecikleri kullanarak veri tabanına kayıt ekleyebilir,
olan kayıtları değiştirebilir silebilir ve bu kayıtlardan listeler oluşturabiliriz. SQL cümlecikleri genellikle aynı
olmakla birlikte farklı veri tabanı ortamlarında değişebilmektedir. Ayrıca veri tabanlarının kendilerine özgü
sql komutları da vardır.
Bu bölümde temel SQL komutları ile veritabanını sorgulayarak veri alma, sıralama, güncelleştirme, silme
gibi işlemlerinin nasıl yapıldığını inceleyeceğiz.
SELECT İfadesi
Bu komut ile database üzerindeki tablonun hangi kolonlarını alacağımız veritabanına söyleriz. Tablonun
bütün kolonlarını görmek istiyorsak '*' karekterini kullanırız. Sadece belli kolonları görmek istiyorsak kolon
isimlerini aralarına virgül koyarak yanyana yazmalıyız. Genel ifadesi aşağıdaki şekildedir.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ismi WHERE Koşul
ORDER BY Siralanacak_sütun [ASC / DESC]
Temel SELECT İfadesi : SELECT ifadesinin en basit şekli,
SELECT * FROM Tablo_ismi
Buradaki (*) tablodaki tüm sütunları (alan) seçecektir. From ise hangi tablolar üzerinde çalışacağımızı veri
tabanına söylüyoruz. Eğer aynı sql cümleciği ile bir kaç tablo üzerinde işlem yapmak istersek tablo isimleri
arasına virgül koymalıyız.
Belirli Sütunların Seçilmesi : Tablodan istenilen sütunlar seçiilebilir.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ismi
WHERE İfadesi : Gerçekte tablodaki kayıtların sadece bir kısmına ihtiyaç duyarız. Bize gerekli olan dataları
diğerlerinden ayıran bazı özellikleri vardır. İşte bu özellikleri bu komut yardımı ile kullanarak gerekli datalara
ulaşabiliriz. Koşulu sağlayan bilgilerin tablodan seçilmesini sağlar.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ismi WHERE Ko şul
Koşullarda kullanılan operatörler :
Karşılaştırma operatörleri : =, <>, <, <=, >, >=
SELECT * FROM personel WHERE boy < 170
Mantıksal Operatörler : NOT, OR, AND
Alfabetik Operatörler : LIKE, NOT LIKE : Bu ise içinde belli bir karakter dizisi bulunan datalara ulaşmak
istersek kullanabileceğimiz bir operatördür.
SELECT * FROM personel WHERE dogumYer LIKE '%SAKARYA%' : Doğum yeri SAKARYA olan
personel seçilir.
SELECT * FROM personel WHERE dogumYer LIKE '%SAKARYA' : Doğum yerinin sonunda
SAKARYA olan personel seçilir.
SELECT * FROM personel WHERE dogumYer LIKE 'SAKARYA%' : Doğum yerinin başında SAKARYA
olan personel seçilir.
Değer : IN, NOT IN : Bu komut ile belli bir kolonun kümesini vererek işlemimizi daha kolay bir şekilde
yapabiliriz.
SELECT * FROM stok WHERE stokKod IN (1,122,33) : Stok kodu 1, 122 veya 33 olan kodlara sahip
olan mallar lseçilir.
Değer Aralıkları : BETWEEN, NOT BETWEEN : Aralıklı sorgulama yapmak istersek kullanabilecegimiz bir
operatördür.
SELECT * FROM personel WHERE dogumTar BETWEEN '01.01.1960' and '01.01.1970' : Doğum
tarihi bu 2 tarih arasında olan personel seçilir.
ORDER BY İfadesi :Bu komut ile belirtilen kolona göre artan veya azalan bir sıralama ile sorgulama
yapabiliriz. ASC : kullanarak küçükten büyüğe doğru artan sıralama yapabiliriz. DESC : kullanarak
büyükten küçüğe doğru azalan sıralama yapabiliriz. Ancak ASC kullanmak zorunlu değildir. Çünki default
sıralama tipi ASC'dir. Aynı anda birkaç kolon üzerindende sıralama yapabiliriz. Satırları sıralamak için
kullanılır.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ismi
ORDER BY Siralanacak_sütun [ASC / DESC]
SQL'de Veri Tabanı Yaratma
SQL komutları yalnızca bir veri tabanı üzerinde geçerli olduğu için veri tabanı yaratma işlemlerinide
anlatmanın yararlı olacağına inanıyorum. Aşağıda anlatılan işlemler SQL Server 6.5 üzerinde
gerçekleştirilmiştir.Database yaratmak için aşagıdaki komutu yazabiliriz.
CREATE DATABASE database_name [ON {DEFAULT | database_device} [= size]
[, database_device [= size]]...]
[LOG ON database_device [= size]
[, database_device [= size]]...][FOR LOAD]
database_name : Bu yaratılacak olan veri tabanının ismidir.
ON : Bu ise yaratılacak olan veri tabanın hangi device üzerinde yer alacağını belirten bir parametredir.
Burada aynı zamanda bu device üzerinde size parametresi ile database'in ne kadar yer kaplayacağını
belirmiş oluyoruz. Eğer device tanımlamaz isek SQL server default device üzerinde 5 mb bir veri tabanı
yaratacaktır.Bu parametre içinde birkaç device ismi kullanarak veri tabanını bir kaç device üzerinde yer
almasını sağlayabiliriz.
LOG ON : Bu ise yaratılacak olan veri tabanın log'unun hangi device üzerinde yer alacağını belirten bir
parametredir. Burada aynız zamanda bu device üzerinde size parametresi ile database'in log'unun ne kadar
yer kaplayacağını belirmiş oluyoruz. Eğer device tanımlamaz isek SQL server default device üzerinde bir log
tutacaktır.Bu parametre içinde birkaç device ismi kullanarak veri tabanı log'unun bir kaç device üzerinde yer
almasını sağlayabiliriz.
INNER JOIN İfadesi
SELECT ifadesi, bilgileri yalnızca bir tablodan seçti. Halbuki birçok uygulama birden çok tablo kullandığı için,
birden çok tablodan gelen bilgilerin birleştirilmesi gereklidir. 2 çeşit birleştirme vardır. İç ve dış birleştirme.
İç birleştirme, yalnızca birleştirme koşulunun True (Doğru) olduğu satırları verecektir.
SELECT Sütun_ismi_1, Sütun_isimi_2,.... FROM Tablo_ 1
INNER JOIN Tablo_ 2
ON Tablo_1.Sütun = Tablo_2.Sütun
INSERT İfadesi
INSERT ifadesi, bir tabloya yeni bir kayıt ilave etmek için kullanılır.
INSERT INTO Tablo_ismi (Sütün_ismi_1, Sütün_ismi_2, .....)
VALUES (Değer1i Değer2,......)
UPDATE İfadesi
UPDATE ifadesi, bir tablodaki bilginin değerlerinin değiştirilmesine olanak sağlar.
UPDATE Tablo_ismi
SET Sütün_ismi_1=Değer1, Sütün_ismi_2=Değer2, .....)
WHERE Koşul
DELETE İfadesi
DELETE ifadesi, bir tablodaki satır(lar)ın silinmesini sağlar.
DELETE FROM Tablo_ismi
WHERE Koşul
SQL Fonksiyonları
MAX : Verilen sütundaki en büyük değeri geri döndürür.
Select MAX(sütun_adı) FROM tablo;
MIN : Verilen sütundaki en küçük değeri geri döndürür.
Select MIN(sütun_adı) FROM tablo;
SUM : Verilen sütundaki bütün değerleri toplayarak geri döndürür.
Select SUM(sütun_adı) FROM tablo;
AVG : Verilen sütunun aritmetik ortalamasını hesaplar.
Select AVG(sütun_adı) FROM tablo;
COUNT(*) : Verilen tablodaki kayıt sayısını bulur.
Select COUNT(*) FROM tablo;
COUNT(DISTINCT Sütun_adı) : Verilen sütundaki farklı kayıt sayısını bulur.
Select COUNT(DISTINCT sütun_adı) FROM tablo;
FIRST : Sütunun ilk değerini bulur.
Select FIRST(sütun_adı) FROM tablo;
LAST : Sütunun son değerini bulur.
Select LAST(sütun_adı) FROM tablo;
UCASE : Sütunun değerini büyük harflere dönüştürür.
Select UCASE(sütun_adı) FROM tablo;
LCASE : Sütunun değerini küçük harflere dönüştürür.
Select LCASE(sütun_adı) FROM tablo;
ADO.NET ve Veritabanı Erişim Araçları
ADO.NET Microsoft'un yeni kuşak veri erişim teknolojisidir. XML desteğine sahiptir. ADO.net önceki veri
erişim metotlarında farklı olarak Disconnected(Bağlantısız) veri erişimini kullanır. Bu tür bağlantılarda
bağlantı kurulduktan sonra işlem yapılana kadar bağlantı açıktır, işlem bittikten sonra bağlantı kapatılır. Bu
da Connected (Bağlantılı) veri erişimindeki sistem performansı gibi problemleri yaşamamıza engel olur.
ADO.NET ‘te biri (connected) bağlantılı, diğeri (disconnected) bağlantısız taraf olmak üzere 2 taraf var.
Bağlantılı taraf, bir .NET veri sağlayıcısının üzerinden yapılan bağlantıyla çalışan nesneleri içeriyor.
Connection, Command, DataRader, DataAdapter bu nesnelerin başlıcaları. Bu nesnelerin ortak
özelliği, aktif bir bağlantıya ihtiyaç duymaları.
Diğer tarafta, bağlantısız bir yapı var: DataSet. DataSet, veri kaynağı bağlantısından bağımsız olarak
tasarlanan bir nesne. Hafızada duran ve istendiğinde XML olarak kalıcı hale getirilebilen ilişkisel bir
veritabanı olarak düşünülebilir. Zira DataSet, birden fazla tablolar içerebiliyor; bu tablolar arası ilişkiler,
kısıtlamalar, görünümler tanımlamanıza olanak veriyor. DataSet’e attığımız her bir tablo DataTable’larda
tutulur. DataTable’ lar DataSet’ ten bağımsız olarakta kullanılabilmektedir. DataTable, kolon ve
satırlardan oluşur. DataTable üzerinde yapılan her şey bellekte yapılmaktadır, gerekli metodlar yazılmadığı
sürece mevcut veritabanını etkilemez.
VERiTABANI
Veri Saglayicilari
DATAADAPTER
DATASET
Windows
Formlari
CONNECTION
COMMAND
Web
Formlari
DATAREADER
KULLANICILAR
ADO.NET
Connection, Command, DataReader, DataAdapter, DataSet ve DataView nesneleri, ADO.NET’in temel
elemanlarıdır.
Veri Sağlayıcılar
ADO.NET 2 ana veri sağlayıcısına (Data Provider) sahiptir :
-
OLEDB Veri sağlayıcıları : Access ve diğer veritabanlarına erişmek için kullanılır.
SQL Veri sağlayıcıları : SQL Server 7.0 ve daha üst versiyon veritabanları için kullanılır.
Connection : Veritabanı ile Visual Basic .NET uygulaması arasındaki bağlantıyı sağlar. Conncetion (bağlantı)
bildirimi,
OLEDB için à
OleDbConnection baglanti1=new OleDbConnection(ConnectionString);
SQL için à
SqlConnection baglanti1=new SqlConnection(ConnectionString);
ConnectionString ifadesi ise, tırnak işaretleri arasında birbirinden noktalı virgüllerle ayrılan
parametre = değer
ifadelerinden oluşur. Önemli parametreleri şöyle sıralayabiliriz :
Provider
: Veri sağlayıcısının adı
Data Source
: Verinin kaynağı (SQL Serverin adı veya adresi)
Initial Catalog : Veritabanının adı
User ID
: Kullanıcı Adı
Password
: Parola
Integrated security veya Trusted_Connection : Bağlantının güvenlik tanımı.
Örnek :
OLEDB için,
OleDbConnection baglanti_ole=new OleDbConnection();
baglanti_ole.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=c:\b2007\ogrenci.mdb”;
baglanti_ole.Open();
SQL için,
SqlConnection baglanti_sql=new SqlConnection (“Provider=SQLOLEDB;Data
Source=localhost; “initial catalog=Northwind; User ID=sa, password=aa;”);
baglanti_sql.Open();
Command : Veritabanına komutları aktarır. Aynı şekilde SqlCommand ve OleDbCommand şeklinde 2
seçeneği vardır. Genellikle bir önceki bölümde bahsettiğimiz SQL komutları kullanaılarak erişim yapılacaksa
kullanılır.
Bir Command nesnesini, aşağıdaki gibi oluşturabiliriz :
cmd = new OleDbCommand() veya cmd=new SqlCommand()
Oluşturulan bu nesnenin bir SqlConnection veya OleDbConnection nesnesi ile ilişkilendirilmesi gerekir.
cmd.Connection=baglanti_ole
Çalıştıracağımız komutu da CommandText özelliğine atayarak bildiriyoruz.
cmd.CommandText=”SELECT * From Kimlik”
Ancak tüm bu yaptığımız işlemleri, tek satırda da yapabilirdik :
cmd = new OleDbCommand(“SELECT * From Kimlik”, baglanti_ole)
Command nesnesinin veri kaynağında icra edilmek üzere göndereceği SQL komutunu, bir string ifade
olarak CommandText özelliğine atabiliriz.
Komutu Çalıştırmak
Komutu çalıştırmak için 4 ayrı metot vardır :
ExecuteReader() : Bu metod kayıt döndürecek komutlar için özelleşmiştir. İşletimi sonucu kayıt setini
ifade eden bir SqlDataReader veya OleDbDataReader nesnesi oluşturur.
ExecuteNonQuery() : Veri seti döndürmeyen komutlar için özelleşmiştir. Dönüş değeri, sorgunun
işletiminden etkilenen kayıtların sayısıdır.
ExecuteScalar() : Sorgu sonucu tek bir değer dönecekse bu metod kullanılır.
ExecuteXMLReader() : Sorgu sonucu bir XMLReader nesnesi oluşturur.
Örnek : cmd.ExecuteNonQuery()
DataReader : Veritabanındaki bilginin yalnızca görüntüleneceği (düzeltme, silme gibi günçelleştirme
işemlerinin yapılmayacağı) uygulamalarda kullanılır. Böylece DataSet kullanılmaz ve bazı kontrol işlemlerine
gerek kalmaz. SqlDataReader ve OleDbDataReader iki çeşidi vardır.
Bir DataReader, bir Command nesnesinin Execute çağrımı sonucu döndürülür. Bu ADO’daki Recordset’in
çalışma prensipleriyle benzerlik gösterir ve basit bir şekilde kayıtların üstünde ilerlemeye izin verir.
Connection ve Command nesnelerinin aksine, DataReader nesnesini biz kendimiz oluşturamayız.
DataReader, Command nesnesinin ExecuteReader() metodu ile elde edilir. Bu metod, Command nesnesinin
ifade ettiği sorguyu işletir ve dönen kayıtları temsil edecek DataReader nesnesini oluşturur. DataReader
oluşturulduktan sonra, Read metodunu kullanarak, verileri satır olarak elde edebiliriz.
DataAdapter : Veritabanından aldığı bilgileri DataSet içersine yerleştirmekte veya DataSet’ten aldığı bilgileri
geri göndermektedir.
Kullanımında iki adet parametresi vardır. Bunlardan birincisi DataSet'e doldurmak istediğimiz veriyi belirten
"SELECT * from ogrenci" gibi bir SQL cümlesidir. Ikincisi ise bağlantı cümlesidir. DataSet'e veriyi
doldururken de Fill() methodu kullanılır.
Örnek :
OleDbDataAdapter adaptorOgrenci = new OleDbDataAdapter (“Select * from Ogrenci”,
baglanti_ole)
DataSet : Bilgilerin saklandığı yerdir. DataSet nesnesinde sıfır veya daha fazla DataTable nesnesi olabilir.
DataTableCollection koleksiyonu DataSet içerinde bütün DataTable nesnelerini bulundurur. DataSet kayıtlar
ve tablolar arasındaki ilişkileri düzenlemek için DataRelation koleksiyonunu bulundurur. Aşağıdaki şema
Dataset’in kullandığı yapılar ve XML ile olan alışverişi gösteriliyor. DataSet’de veriye erişmek için yapının
kullandığı Connection ve DataAdapter nesnelerini kullanıyor.
DATASET
DataRelation
DataTable
DataRow
DataColumn
DataView
Constraints
DataRow : Tablodaki bir satırı içerir.
DataColumn : Tablodaki bir sütun hakkında bilgi içerir.
Constraint : Bir ya da daha çok DataColumn nesnesi için kısıtlamayı temsil eder.
DataSet nasıl oluşturulur ve içi doldurulur ? : İlk önce DataSet nesnesi Dim komutu ile oluşturulur. Daha
sonra DataAdaptor nesnesi ile DataSet doldurulur.
DataSet OgrDs = new DataSet( );
adaptorOgrenci.Fill (OgrDs, “ogrenci”);
Veritabanının Güncelleştirilmesi : DataSet üzerinde değişiklikler yapıldıktan sonra, değişiklikleri veritabanına
göndermek için Update() metodu kullanılır. Update() metodu Fill() metoduna benzer.
Örnek : adaptorOgrenci.Update (OgrDs, “ogrenci”)
Veri Bağlamak : Herhangi bir kontrole basit olarak veri bağlamak için aşağıdaki ifade kullanılır :
Kontrol_ismi.Databindings.Add (“Text”, DataSet_ismi.Tablo_ismi,”Değişken ismi”)
Gelişmiş veri bağlamada tüm veri kaynağı bir kontrole bağlanır. Örneğin DataGrid kontrolüne veri bağlamak
için bu metot kullanılır. Örnek :
Datagrid1.DataSource = DataSet1
Datagrid1.DataBind()
CurrencyManager ve BindingContext Nesnesi
Windows formuna bağlanan bir veri kaynağı ile ilgili bir CurrencyManager nesnesi vardır. Bu nesne veri
kaynağında o anda seçili olan konumu tutmaktadır. BindingContext ile form üzerindeki alanlar, tabloya
bağlanır. CurrencyManager ve BindingContext nesnesinin değişik özellikleri vardır :
Position : CurrencyManager nesnesinin yönettiği listedeki geçerli öğeyi alır ya da ayarlar.
Count : CurrencyManager nesnesinin yönettiği satırların (kayıtların) sayısı
Current : Veri kaynağındaki geçerli nesnenin değeri
CurrencyManager CurMan ;
CurMan=this.BindingContext(DataSet1,”Ogrenci”);
CurMan.Position +=1;
Veya
this.BindingContext(DataSet1,”Ogrenci”).Position +=1;
DataRelation : DataSet’te yer alan diğer tablo veya tablolarla ilişkiyi düzenler. Tablolar arasında bu ilişkiyi
düzenlerken ilk olarak DataRelation nesnesi tanımlanır, daha sonra bu ilişki DataSet nesnesine ilave edilir.
Örnek olarak Kimlik tablosundaki Numara kolunu ile Notlar tablosundaki Numara kolonunu ilişkilendirelim :
DataSet DSet = new DataSet();
DataRelation Bag;
Bag=new DataRelation(“Numara”, DSet.Tables(“Kimlik”.Columns.(“Numara”),
DSet.Tables(“Notlar”.Columns.(“Numara”));
DSet.Relationships.Add(Bag);
DataView : DataSet içindeki bilginin istenilen şekilde görüntülenmesini sağlayan nesnedir. Tanımlanması
ve kullanımını aşağıdaki gibi basit bir örnekle gösterebiliriz.
DataView DV = new DataView (dataset1.Tables(“ogrenci”));
DV.RowFilter=” cins = ’k’ ”;
Bu satırlardan sonra yalnızca Cinsiyeti Kadın olanlar görüntülenecektir.
Download