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.