SqlCommand Sınıfını Daha Etkin Kullanalım

SqlCommand sınıfı ile bilindiği gibi veritabanına doğru yürütmek istediğimizi sorguları çalıştırmaktayız. SqlCommand sınıfı ile select,insert,update,delete sorguları yanında Stored Procedure ve tabloları da kullanabiliriz.SqlCommand nesnesine bağımlı olarak çalışan programların performans,güvenlik,kod okunurluğu yönünden tavsiye edilen bazı teknikler vardır. Makalemizde  SqlCommand nesnelerini kullanırken performans attırıcı,güvenlik riskini azaltıcı ve kod okunurluğunu arttırıcı teknikleri inceleyeceğiz.

SqlCommand sınıfı ile inceleyeceğimiz tavsiye teknikler:

  • Sorguların yeniden kullanımı (Prepare)
  • Parametrik sorguların kullanımı
  • Constructor ile nesne örneğinin oluşturulması
  • Tek bir değer döndüren sorgular için ExecuteScalar metodunun kullanılması

Sorguların Yeniden Kullanımı (Prepare)

Uygulamalarımızda sık kullanılan sorgular için SqlCommand sınıfının Prepare metodunu kullanarak sorguya ait çalışma planını ara belleğe alıp çok daha performanslı çalışmasını sağlayabiliriz. Ben örneğimde arka arkada 3 satır veri girişi yapacağım.

[csharp]

string db = "Data Source=.;Initial Catalog=WorkDB;User ID=sa;Password=1";
SqlConnection con = new SqlConnection(db);
con.Open();
SqlCommand cmd = new SqlCommand("insert into tblUsers(UserName,Password) values (@UserName,@Password)", con);
//ilk veri
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar,40).Value="Mesut";
cmd.Parameters.Add("@Password", SqlDbType.NVarChar,10).Value="1";
cmd.Prepare(); //Dikkat
cmd.ExecuteNonQuery();
//ikinci veri
cmd.Parameters["@UserName"].Value="Şenol";
cmd.Parameters["@Password"].Value="1";
cmd.ExecuteNonQuery();
//üçüncü veri
cmd.Parameters["@UserName"].Value = "Güneş";
cmd.Parameters["@Password"].Value = "1";
cmd.ExecuteNonQuery();
con.Close();

[/csharp]

Tek yapmamız gereken SqlCommand nesnesini ilk kez execute etmeden önce Prepare metodunu kullanarak sorgumuzu Sql Server üzerinde ara belleğe aldırmaktır.

Parametrik Sorguların Kullanımı

Parametrik sorgular diğer sorgulara göre daha hızlı çalışır ve Sql Injection saldırısına karşı güvenlik sağlar. Parametrik sorgular kullanarak string değerler için tek tırnak kullanmak zorunluğundan kurturmuş oluruz.

[csharp]

string db = "Data Source=.;Initial Catalog=WorkDB;User ID=sa;Password=1";
SqlConnection con = new SqlConnection(db);
con.Open();
SqlCommand cmd = new SqlCommand("insert into tblUsers(UserName,Password) values (‘"+txtUserName.Text+"’,’"+txtPassword.Text+")", con);
cmd.ExecuteNonQuery();
con.Close();

//Yerine
SqlCommand cmd = new SqlCommand("insert into tblUsers(UserName,Password) values (@UserName,@Password)", con);
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar, 40).Value = "Mesut";
cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 10).Value = "1";

[/csharp]

Constructor ile Nesne Örneğinin Oluşturulması

SqlCommand sınıf örneğini alırken Constructor kullanmak kod okunurluğunu arttıracaktır.

[csharp]

string db = "Data Source=.;Initial Catalog=WorkDB;User ID=sa;Password=1";
string query = "select UserName,Password from tblUsers";
SqlConnection con = new SqlConnection(db);
con.Open();
SqlCommand cmd = new SqlCommand(query, con);

[/csharp]

Tek Değer Döndüren Sorgular İçin ExecuteScalar Kullanılması

Bağzı durumlarda veritabanından tek bir kayıt bilgisi çekmeye ihtiyaç duyabiliriz. Örneğin: Bir tablodaki satır sayısı, ürün ortalama fiyatı,toplam stok durumu gibi tek bir değer ihtiyacımız vardır. Tek bir değere ihtiyacımız olduğunda SqlDataReader ile veriyi okumak pek performanslı olmayacaktır. ExecuteScalar tercih ederek SqlDataReader sınıfından hiç örnekleme bile yapmadan istediğimiz değeri daha hızlı ve performanslı bir şekilde elde edebiliriz.

[csharp]

string db = "Data Source=.;Initial Catalog=WorkDB;User ID=sa;Password=1";
string query = "select COUNT(*) from tblUsers";
SqlConnection con = new SqlConnection(db);
con.Open();
SqlCommand cmd = new SqlCommand(query, con);
Console.WriteLine(cmd.ExecuteScalar());
con.Close();

[/csharp]

Faydalı olması dileklerimle…

Mesut Güneş

Selçuk Üniversitesi Bilgisayar programcılığı bölümünden mezun olduktan sonra birçok firmada Yazılım, İş zekası ve Veritabanı Uzmanı olarak çalıştım. Şuan Türkiye’nin en büyük şirketlerinden biri olan Doğan Online’da Veritabanı Yöneticisi olarak çalışıyorum.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.