Arşiv

Etiketlenen yazılar .net

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

23 Kasım 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.

Windows API Code Pack for Microsoft .NET Framework

18 Kasım 2009 1 yorum

Windows 7 ile gelen yeni özellikleri (JumpList, Tabbed Thumbnails, Thumbnail Toolbars, MultiTouch Desteği, vs..) .Net uygulamalarınızda kullanmak istiyorsanız, şurada yer alan Windows API Code Pack for Microsoft .NET Framework kurulumunu indirin ve bilgisayarınıza kurun.

Kurulum tamamlandıktan sonra, .Net projelerinize ilgili dll’leri referans olarak ekleyerek, çeşitli Windows 7 özelliklerine programatik olarak erişebileceksiniz.

Özellikle, Tabbed Thumbnail özelliğinin, uygulamalara kullanım kolaylığı katacağını düşünüyorum.

MediaPlayer‘ın Windows 7 ile gelen versiyonu, bu özelliği güzel kullanan uygulamalardan biri.

Wiindows7_MediaPlayer_TabbedThumbnail

Siz de uygulamalarınıza böyle bir özellik katmak istiyorsanız, örnek kod..

Gereksinimler:

  • Minimum .Net Framework 3.5 SP1
  • Yazdığınız uygulamayı test edebilmeniz için Windows 7 (eh, haliyle!)

Asp.net’te web.config ile globalization

18 Kasım 2009 Yorum yapılmamış

Web uygulamalarında, geliştirme yaptığınız bilgisayarınızda türkçe karakterleri düzgün görüyorsanız, fakat uygulamayı sunucuya publish ettiğinizde türkçe karakterlerde bozulma oluşuyorsa (özellikle ğ,ü,ö,ı,ş karakterlerinde); sorun büyük ihtimalle sunucunun dil ayarlarından kaynaklanıyordur.

Sunucunun dil ayarları ile uğraşmak yerine, web.config dosyasında yapacağınız küçük bir değişiklik ile, bu sorunun üstesinden gelebilirsiniz.

Yapılması gereken, System.Web node’ u içerisine;

<globalization fileEncoding="iso-8859-9" responseEncoding="iso-8859-9" />

tagını eklemek.

.Net ortamında pattern kavramı

16 Kasım 2009 1 yorum

Pattern, kelime olarak fransızca patron kelimesinden gelmektedir ve tekrarlayan olayları veya nesneleri ifade etmektedir.

Yazılım dünyasında ise, “sürekli karşılaşılan durumlar için geliştirilmiş ve dökümante edilmiş, çözüm yolu standart haline gelmiş, tasarım kalıpları” şeklinde tanımlanabilir.

    En bilindik tasarım kalıpları;

  • Abstract Factory
  • Adapter
  • Bridge
  • Builder
  • Chain of Responsibility
  • Command
  • Composite
  • Decorator
  • Facade
  • Factory Method
  • Flyweight
  • Interpreter
  • Iterator
  • Mediator
  • Memento
  • Observer
  • Prototype
  • Proxy
  • Singleton
  • State
  • Strategy
  • Template Method
  • Visitor

Bundan sonraki birkaç yazımda bu tasarım kalıplarının ne olduklarını ve projelere nasıl uygulandıklarını, örneklerle anlatmaya çalışacağım.

C#’ta anahtar kelimeyi değişken ismi olarak kullanma

16 Kasım 2009 Yorum yapılmamış

NET_CLR_Unleashed

Google Kitaplar‘da, şuradan bulabileceğiniz .Net CLR Unleashed kitabından edindiğim bir bilgiyi paylaşmak istiyorum.

CLS (Common Language Specification), CLS-Uyumlu tüm dillerin, anahtar kelimelerin değişken ismi olarak kullanabilmesini sağlayacak bir mekanizma sunmasını ister.

C# dili için bu mekanizma, anahtar kelimenin başına gelen @ işareti ile sağlanır.

@ işareti kullanılarak, şunlar yapılabilir;

int @int = 8;
Console.WriteLine("integer değişken : {0}", @int);
bool @bool = true;
Console.WriteLine("boolean değişken : {0}", @bool);

Bu sayede, anahtar kelime olan “int”, değişken ismi olarak kullanılabildi.

Kaynak : MSDN: C# Keywords, MSDN: CLS, MSDN: What is CLS, Amazon: NET CLR Unleashed

Paylaşımda Olan Dizinleri Bulmak ( C# + VB.NET )

13 Kasım 2009 Yorum yapılmamış

Bilgisayarda paylaşımda olan klasörleri bulmamız gerektiğinde WMI sorgusu çalıştırmamız gerekir.

WMI (Windows Management Instrumentation) hakkında daha detaylı bilgiye MSDN üzerindeki bu kaynaktan ulaşabilirsiniz.

WMI sorgusu çalıştırmak için öncelikle System.Management.dll’i projemize referans göstermeliyiz.

PaylasimdaOlanDizinler_Referans

System.Management.dll’i projeye referans gösterdikten sonra form üzerine bir Listbox, bir de Button ekleyip, butonun click event’ine aşağıdaki kodu yazıyoruz;

C# Code :

    private void btnDizinleriListele_Click(object sender, EventArgs e)
    {
      //WMI sorgusu çalıştırıyoruz.
      ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Share");

      //Win32_Share classı :
      /*
        class Win32_Share : CIM_LogicalElement
        {
          uint32   AccessMask;
          boolean  AllowMaximum;
          string   Caption;
          string   Description;
          datetime InstallDate;
          uint32   MaximumAllowed;
          string   Name;
          string   Path;
          string   Status;
          uint32   Type;
        };
       */
      foreach (ManagementObject dizin in mos.Get())
        lbDizinler.Items.Add(string.Format("Dizin : {0}\\{1} ({2})", dizin["Path"], dizin["Name"], dizin["Description"]));
    }

VB.NET Code :

  Private Sub btnDizinleriListele_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDizinleriListele.Click
    'WMI sorgusu çalıştırıyoruz.
    Dim mos As New ManagementObjectSearcher("SELECT * FROM Win32_Share")

    'Win32_Share classı :
    'class Win32_Share : CIM_LogicalElement
    '{
    ' uint32   AccessMask;
    ' boolean  AllowMaximum;
    ' string   Caption;
    ' string   Description;
    ' datetime InstallDate;
    ' uint32   MaximumAllowed;
    ' string   Name;
    ' string   Path;
    ' string   Status;
    ' uint32   Type;
    '};
    For Each dizin As ManagementObject In mos.Get()
      lbDizinler.Items.Add(String.Format("Dizin : {0}\\{1} ({2})", dizin("Path"), dizin("Name"), dizin("Description")))
    Next
  End Sub

 

ManagementObjectSearcher class’ının constructor’ına SELECT * FROM Win32_Share yazdığımıza dikkat edin.

Win32_Share class’ı hakkında daha detaylı bilgiye MSDN üzerinde yeralan bu kaynaktan ulaşabilirsiniz.

C# için kaynak kodlar : PaylasimdaOlanDizinler_C#.zip
VB.NET için kaynak kodlar : PaylasimdaOlanDizinler_VB.zip