Merhaba dostlar.

Efendim bildiğiniz gibi ADO.NET teknolojisinde, iki türlü veri manipülasyon tekniğinden bahsetmek mümkün. Bunlardan biri bağlantılı (connected) diğeri de bağlantısız (disconnected) teknikleri. Veritabanından resultSet okumak için de bu iki farklı teknikten birer nesne bulunmakta. Connected tekniği için SqlDataReader nesnesi, disconnected için ise DataTable nesnesi. Şimdi gelin bu iki nesneden hangisi daha hızlı bunu görelim:

Efendim… Önce, yarışmacılarımızın yarışacağı arenayı bir tasarlayalım…

Tamamdır… Şimdi sıra geldi test için gerekli kodları yazmaya; DataTable isimli yarışmacımızın butonundan başlayalım:

      private void btnDataTable_Click(object sender, EventArgs e)

      {

          SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True");

          SqlDataAdapter da = new SqlDataAdapter("SELECT ProductName FROM Products",conn );

          DataTable dt = new DataTable();

          DateTime baslangic = DateTime.Now;

          da.Fill(dt);

          listBox1.DataSource = dt;

          listBox1.DisplayMember = "ProductName";

          DateTime bitis = DateTime.Now;

          TimeSpan fark = bitis - baslangic;

          label1.Text = fark.TotalMilliseconds.ToString();

       }   

Burada baslangic ve bitis isimli iki DateTime tipinde değişkenim var gördüğünüz gibi. Kodun sonunda ise, bitis ile baslangic değerleri arasındaki farkı toplam milisaniye cinsinden label'a yazdırıyorum.

Şimdi aynı şeyi SqlDataReader nesnesi için de yapalım

        private void button2_Click(object sender, EventArgs e)

       {

            SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True");

            SqlCommand cmd = new SqlCommand("SELECT ProductName FROM Products", conn);

            conn.Open();

            DateTime baslangic = DateTime.Now;

            SqlDataReader dr = cmd.ExecuteReader();

            while (dr.Read())

            {

               listBox2.Items.Add(dr.GetString(0));

            }

            DateTime bitis = DateTime.Now;

            conn.Close(); 

            TimeSpan fark = bitis - baslangic;

            label2.Text = fark.TotalMilliseconds.ToString();

        }

Ve yarışmacılarımız hazırlar. Şimdi gösteri zamanı baylar bayanlar… Yalnız, hatırlatmam gereken bir şey var. Projeyi çalıştırdığınızda, önce bir butona sonra diğer butona basmak suretiyle ölçüm yapmayınız! Eğer böyle yaparsanız; bu pek adil olmayacaktır. Çünkü, sonuçta kodlardan birini çalıştırmak data’nın cache’ lenmesine neden olacaktır. Bu nedenle; test şöyle yapılmalıdır; önce bir butona basıp kodu çalıştırın. Diğer butonu ise projeyi kapatıp açtıktan sonra çalıştırın… İşte benim elde ettiğim sonuç:

 

İlk çalıştırma… SqlDataReader nesnesi 87 ms

 

Ve ikinci.. DataTable nesnesi 260 ms…

SONUÇ: SqlDataReader açık ara önde :-)

Türkay ÜRKMEZ    

turkay@turkayurkmez.com