19 Ağustos 2008 Salı

Visual Studio 2008 Service Pack 1 ve .NET Framework 3.5 Service Pack 1 çıktı! Bayinizden isteyiniz..




Microsoft özellikle Windows Vista'nın piyasaya sürülmesinin ardından yazılımcılar için çeşitli araçları birer birer geliştirdi. Bunların sonucunda ortaya çıkan yeni ürün gamında Windows Presentation Foundation(WPF), Windows Communication Foundation(WCF), LINQ gibi yeni teknolojilerin yanı sıra Hyper V ve MSSQL 2008 gibi performansa direk etki edebilecek ürünler mevcuttu.




Tabii ki Microsoft ile yıllardır tanışıklığı olan yazılım dünyası, kullanılabilirliği oldukça yüksek olan bu teknolojilerden hemen faydalanmak yerine ölçüp biçmeyi ve "service pack" beklemeyi tercih etti. Şimdi ise muradına eriyor. Özellikle WPF ve ADO.NET yani bir anlamda LINQ için yüzde 20'den 45'e kadar değişen performans artışları bu sefer yazılımcıları ikna edecek gibi.




Ayrıca TFS yani Team Foundation Server üzerinde de çeşitli geliştirmeler yapıldığını da eklemek gerekiyor. Microsoft gerek görsellik ve kullanılabilirlik gerekse performans bakımından rakipleriyle arayı açmak arzusunda. Şimdi bir taraftan son kullanıcı için çok daha kullanışlı ve görsel ürünleri beklerken, bir diğer taraftan da Java ve Özgür Yazılım camiasından Microsoft'un bu atağına cevap bekleyebiliriz.




Ayrıntılı bilgi : (ingilizce)


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.