11 Ağustos 2008 Pazartesi

Linq2SQL ile veritabanı bağlantısı

.Net Framework 3.5 ile yazılımcıların karşısına çıkan LINQ ve bunun en önemli araçlarından biri olan LINQ2SQL çok temel haliyle veri manipülasyonunu kolaylaştırdığı gibi hepimizin pek çok kez üzerinden geçtiği rutinleri daha basit ve kullanıcı dostu hale getiriyor.

IENumerable olarak tanımlanmış bütün koleksiyonlar üzerinde çeşitli sorgular işletmenizi sağlayan LINQ sorgu dili, veritabanı ile entegre çalışma kabiliyetini de LINQ2SQL sayesinde kazanınca pek çok yazılımcı için düşünülmesi gereken bir alternatif oluyor.

Dilerseniz LINQ2SQL aracılığıyla bir veritabanına bağlanmayı ve bu bağlantı üzerinden veri tabanı üzerinde yazma ve okuma işlemleri yapmayı deneyelim.






Veritabanımızda ismi Öğrenci olan ve ÖğrenciNo, AdiSoyadi, DogumTarihi ve Sinif kolonlarını içeren bir tablomuz olsun. Bu tablo içerisindeki sembolik bilgileri ise yukarıdaki gibi hazırlayalım.

Daha sonra bu bilgileri basit bir form üzerinde göstermek için kolları sıvıyoruz.


Öncelikle Form Uygulaması olacak basit bir yeni proje yaratıyoruz. Bu projenin yaratılmasıyla birlikte hemen herkesin tahmin edebileceği üzere aşağıdakine benzer bir ekran ile karşılaşırız.



Şimdi bu form üzerine bir DataGridView ekleyelim ve formu biraz genişletelim.


Verileri göstereceğimiz ekran artık hazır olduğuna göre LINQ2SQL ile ilgili işlemlere geçebiliriz.

İlk olarak veriyi almak istediğimiz tablo veya tablolar için .dbml uzantılı mapping verilerini hazırlamalıyız. Bunun için ilk olarak proje özelliklerinden yeni dosya ekle’yi seçmemiz gerekiyor.



“Add” tuşuna tıklamamız ile birlikte Ogrenci tablosuna karşılık gelecek .dbml uzantılı dosyayı yaratıyoruz. Şimdi bu dmbl dosyası üzerinde yapacağımız değişikliklerle bu dosyayı güncelleyeceğiz.


Server Explorer ekranından istediğimiz veritabanındaki istediğimiz tabloyu buluyor ve bunu dmbl dosyasının üzerine sürükleyip bırakarak tablo özelliklerini LINQ2SQL içerisine kopyalıyoruz.
Geçmişte DataSet yaratarak sağladığımız entegrasyonu artık dbml ile yapıyoruz. Daha sonra kod içerisinde

//Burada ogrenci icin bir data context yaratiliyor.
//istenirse bir connection sinifi ile de yaratilabilir
OgrenciDataContext odc = new OgrenciDataContext();

IEnumerable sonuc = from ogrenciSatir
in odc.Ogrencis
where ogrenciSatir.Sinif == 1
select ogrenciSatir;

dataGridView1.DataSource = sonuc;

şeklindeki kod ile birinci sınıfta okuyan öğrencileri grid’e atabiliyoruz.

Yeni bir öğrenci girmek için ise

//rastgele bilgilerle yeni bir ogrenciyi listemize ekleyelim
Ogrenci yeniOgrenci = new Ogrenci();
yeniOgrenci.OgrenciNo = 5;
yeniOgrenci.AdiSoyadi = "Test ogrenci";
yeniOgrenci.DogumTarihi = DateTime.Now;
yeniOgrenci.Sinif = 1;

//context olusturuluyor
OgrenciDataContext odc = new OgrenciDataContext();
odc.Ogrencis.InsertOnSubmit(yeniOgrenci);

//degisiklikler kaydediliyor.
odc.SubmitChanges();

şeklinde bir kod yeterli.

SubmitChanges komutu veritabanı ile var olan koleksiyonumuzu senkronize ediyor.

Programı çalıştırdığımızda görüntü şu şekilde oluyor:


Tekrarlamakta fayda var ki burada bu örnekte bir Ogrenci objesi ve bunlardan oluşan bir IEnumerable koleksiyonundan faydalandık. DataSet’ler LINQ2SQL için bir anlamda gereksiz hale geldi.

LINQ Performansı ve halen ORACLE ile uyumu olmaması halen soru işaretleri olsa da yeni çözümler için değerlendirilmesi gereken bir alternatif.

Performans?

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1438097&SiteID=1

adresinde yer alan bir araştırmada ortaya çıkan tablo LINQ’in performans açısından rakiplerinden bir hayli geride olduğu yönünde. Sonuçlar:

0.6600693 saniye // Linq to Sql query (bağlantı manuel açılıyor)
0.5737961 saniye // Linq to Sql query (Bağlantı Linq tarafından kontrol ediliyor)
0.1194771 saniye // SqlCommand / SqlDataReader (Bağlantı sürekli olarak açık)
0.1422770 saniye // SqlCommand / SqlDataReader (bağlantı her seferinde açılıp kapatılarak)

Hatırlatmakta fayda var ki LINQ ile sorgu çekerken Cache’den faydalanmadık. Cache kullanıldığı taktirde bu rakamların daha iyi olması beklenir (ki bu hem Hibernate hem de NHibernate için de böyle olmuştur. )

Ayrıca tabii ki LINQ henüz üzerinde çok çalışılacak bir proje. Gelecekte LINQ sadece kullanılabilirlik olarak değil aynı zamanda performans olarak iyi noktalara gelebilir.

Hiç yorum yok: