Datareader | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar datareader

DataTable ve DataReader nesnelerini yarıştıralım

23 November 2009 Yorum yapılmamış

.Net ortamında veriye erişim modeli olarak kullanabileceğimiz iki seçenek vardır; Bağlantılı (Connected) ve Bağlantısız (Disconnected) Ortam.

  • Bağlantılı veri erişim modelinde, veriye erişmek için DataReader classını,
  • Bağlantısız veri erişim modelinde ise, genellikle DataTable classını kullanırız.

Bu yazımda, bu iki class’ı benzer şartlar altında yarıştıracağız ve hangisinin veriyi daha hızlı getirdiğine karar vereceğiz.

DataTable_vs_DataReader

Projenin kaynak kodlarını buradan download edebilirsiniz.

Kaynak kodlara baktığınızda görebileceğiniz gibi, proje tek form’dan oluşuyor. Formun Load event’inde, AdventureWorks2008R2 veritabanına bağlantı açılıyor ve PR_TABLO_LISTESI procedure’ü çalıştırılıyor.

PR_TABLO_LISTESI procedure’ünün kodları;

CREATE PROCEDURE PR_TABLO_LISTESI
AS
DECLARE @T TABLE (TABLO_ADI VARCHAR(100), SATIR_SAYISI INT)

INSERT INTO @T
EXEC sp_msForEachTable 'SELECT ''?'', COUNT(*) FROM ? WITH (NOLOCK)'

SELECT * FROM @T ORDER BY SATIR_SAYISI DESC

Gördüğünüz gibi, procedure’ün yaptığı çok fazla birşey yok. Pek fazla bilinmeyen ve dökümante edilmemiş sp_msForEachTable sistem prosedür’ünü kullanarak veritabanında bulunan her tablonun ismini ve satır sayısını döndürüyor.

Bu sistem prosedür’ünün nasıl kullanıldığını başka bir yazıda anlatmayı planlıyorum. (Eminim BilgeAdam’daki öğrencilerim bu prosedür’ü hatırlayacaklardır)

Form’un Load eventinin devamında, prosedür’den dönen liste (tablo isimleri ve satır sayıları) lvTablolar ismindeki ListView component’ine dolduruluyor.

cmbTekrarAdet isimli combobox’da yer alan (5 Adet, 10 Adet, 20 Adet) elemanlarından varsayılan olarak 10 Adet elemanı seçili olarak geliyor. Bu combobox, testin peşpeşe kaç defa tekrar edeceğini belirliyor. Böylece bilgisayardaki anlık performans değişikliklerine karşı önlem almış oluyoruz.

Yarış Başlasın Butonunun Click event’inde, yeni bir Thread nesnesini YarisBaslasin() methodunu çalıştıracak şekilde oluşturuyoruz ve başlatıyoruz.

YarisBaslasin() methodunu Arayüz’den (User Interface : UI) ayrı bir thread’den başlatarak, test süresince formda oluşacak kilitlenmeleri önlemiş olduk.

Method’un içerisinde DataTableHesapla() ve DataReaderHesapla() methodları çağırılıyor.

Bu methodlarda TekrarAdet defa (cmbTekrarAdet kontrolünden geliyor) SqlConnection açılıyor, ListView’da seçili tabloya SELECT çekiliyor ve dönen kayıtların üzerinde tek tek geziliyor.

Son olarak, DataTable ve DataReader nesnelerinde bu işlemlerin ne kadar sürdüğü karşılaştırılıyor ve sonuç ekranın altındaki bir label’da gösteriliyor.

Süre ölçmek, ADO.NET Connected ve Disconnected Environment’ı karşılaştırmak için tek başına kullanılacak bir yöntem değil. Fakat en azından bir fikir verebilir.