MSsql veritabanımızda okuma işlemleri yapacağımız zaman ExecuteReader ve ExecuteScalar metodlarını kulanıyoruz. Bu iki metodda sadece select sorgulamalarında çalışmaktadır. Insert, Delete, Update gibi sorgulama işlemlerinde ise ExecuteNonQuery metodunu kullanıyoruz.
ExecuteScalar metodu tek bir değer döndüren sorgulama işlemlerinde kullanılmaktadır. Örneğin belli bir alandaki sayısal değerlerin toplamını veya tablodaki kayıt sayısını veren sorgulamalar gibi. sum, count, avg, max, min vs.
ExecuteReader metodu ise select sorgusu ile çektiğimiz verileri satır ve sütün olarak herhangi bir veri kaynağına aktaracağımız durumlarda tercih edilmektedir. Aynı zamanda bu metod ile executescalar gibi tek bir değeri okuma işlemide yapılabilmektedir. Bunun içinde executereader metodunun CommandBehavior.SingleResult parametresi kullanılmaktadır.
Şimdi her ikiside tek bir değeri okuma işlemini gerçekleştiriyor o zaman hangisini kullanmalıyız ?
Yapacağımız örnek uygulamada da bunu öğrenmeye çalışacağız. Burada metodların çalışma zamanını tesbit etmek için Stopwatch sınıfını kullanıcaz. Normalde kodun çalışma zamanını belirlemek için DateTime.Now kullanarak kodun ilk çalışma zamanı ile son çalışma zamanı arasındaki farkı alıyorduk. Stopwatch sınıfı ile bunu daha hassas bir şekilde ölçmüş olacağız.
Örnek Uygulama için aşağıdaki gibi basit bir veritabanı tasarladım. Veritabanımızın ismi deneme ve kisiler tablosuna sahip.

File > New > Project ve yeni bir Console Application oluşturuyoruz. Ve kodlarıda aşağıdaki gibi yazıyoruz. Ben gerekli kısımlara açıklama satırları ekledim.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data; // ekliyoruz.
using System.Data.SqlClient; // ekliyoruz.
using System.Diagnostics; // Stopwatch sınıfını kullanabilmek için bu namespace'i ekliyoruz.
namespace PerformansTest
{
class Program
{
static void Main(string[] args)
{
/*ExecuteReader*/
Stopwatch stpwch = new Stopwatch(); //stopwatch sınıfından stpwch isimli bir değişken oluşturduk.
SqlConnection _con = new SqlConnection(@"Data Source=XP7\XPSEVENSQLSERVER;Initial Catalog=deneme;Integrated Security=True");
SqlCommand _cmd = new SqlCommand("select*from kisiler", _con);
_con.Open();
stpwch.Start(); // stpwch değişkeninin ilk çalışma noktası burası.
SqlDataReader _dr = _cmd.ExecuteReader(CommandBehavior.SingleResult);
_dr.Read();
stpwch.Stop(); // stpwch değişkeninin bitiş noktası burası. yani hangi kod aralığının çalışma zamanını kontrol edeceksek ilgili kodların üst ve alt satırlarında çalışma ve bitiş noktasını belirtiyoruz.
Console.WriteLine("ExecuteReader Sonucu:");
Console.WriteLine("----------------------");
Console.WriteLine("Okunan Veriler = " + _dr["kisi_ad"].ToString());
_con.Close();
_dr.Close();
Console.WriteLine("Verilerin okunma süresi = " + stpwch.Elapsed.ToString());
Console.WriteLine("");
/*ExecuteScalar*/
Stopwatch stpwch2 = new Stopwatch(); //stopwatch sınıfından stpwch2 isimli bir değişken oluşturduk.
SqlConnection _con2 = new SqlConnection(@"Data Source=XP7\XPSEVENSQLSERVER;Initial Catalog=deneme;Integrated Security=True");
SqlCommand _cmd2 = new SqlCommand("select * from kisiler", _con2);
_con2.Open();
Console.WriteLine("");
Console.WriteLine("ExecuteScalar Sonucu:");
Console.WriteLine("----------------------");
stpwch2.Start(); // stpwch2 değişkeninin ilk çalışma noktası burası
Console.WriteLine("Okunan Veriler = " + _cmd2.ExecuteScalar().ToString());
stpwch2.Stop(); // stpwch2 değişkeninin bitiş noktası burası.
_con2.Close();
Console.WriteLine("Verilerin okunma süresi = " + stpwch2.Elapsed.ToString());
Console.ReadLine();
}
}
}
Projeyi derleyip çalıştırdığımda ekran görüntüsünü aşağıdaki gibi aldım.

Ekran çıktısındanda gözüktüğü gibi ExecuteScalar metodu ExecuteReader metodundan yaklaşık 2.5 kat daha hızlı çalışmaktadır. Yalnız bu değerler benim kendi PC kaynaklarıma göre çıkan sonuçlar. Performans değeri daha düşük ya da daha yüksek bir PC üzerinde bu sonuçların değerleri değişebilir. Ama hangi PC olursa olsun çıkan kıyaslama sonucu değişmeyecektir.
Evet Arkadaşlar bu örnekde mssql veritabanından tek bir değeri okurken kullanılan metodların veri okuma hızlarını test etmeye çalıştık.
Faydalı olması umuduyla hepinize kolay gelsin.
İyi çalışmalar.