Ado.Net SqlDependency Sınıfı Nedir ve Kullanımı
Merhaba arkadaşlar,Bu yazıda ado.net framework 2.0 ile gelen ve şuandaki mevcut 4.5 sürümüne kadar devam eden bir sınıfı anlatacağım.Bu sınıf SqlDependency olarak bilinen yararlı bir sınıftır.SqlDependency sınıfı, bir SqlCommand ile ilişkilendirilerek kullanılır ve içsel olarak bir SqlNotificationRequest nesnesinide barındırır.SqlCommand sınıfının Notification işlemine uyan bir Select sorgusu içermesi gerekir.Örneğin Select * from TabloAdı diye bir sorgu yazamazsınız.Bu sorguyu Select kolon1,kolon2 from TabloAdı şeklinde yazmanız gerekmektedir.Belirtilen Sql ifadesi çalıştırıldığında, SqlDependency nesnesi ilgili SqlCommand nesnesi için sunucuda bir Notification açılacağını sql sunucusuna bildirir. Sql sunucusu bu mesaj üzerine ilgili sql komutunu çalıştırır ve Notification nesnesini sunucuya register eder. Bu bize, çalıştırılan sql sorgusunun sunucaya ekstradan bir takım bilgiler daha gönderdiğini göstermektedir. Bu bilgiler çoğunlukla, kaydı tutulacak Notification ile ilgilidir ve SqlDependency sınıfının ilgili yapıcı metodları yardımıyla ayarlanabilir.
Notification nesnesi, sunucuya kayıt edildikten sonra, komutun çalışması ile elde edilen sonuçlar ön belleğe alınır ve ilgili Notification nesneside Server Service Broker Queue tarafından kuyruğa atılır. Buradaki ön bellekleme işlemi aslında bir temp tablosunun oluşturulmasından başka bir şey değildir. Bu noktadan itibaren Sql sunucusu, ilgili satır kümesini izlemeye başlar. Eğer satır kümesi üzerinde yukarıda bahsettiğimiz durumlardan birisi nedeni ile değişiklikler olursa, sp_DispatcherProc sistem prosedürü yardımıyla istemci uygulamanın SqlDependency sınıfına ait olan OnChange olayına bilgi mesajı gider.
Mimari her ne kadar karışık gibi görünsede, uygulanabilirliği son derece kolay ve basittir.Daha iyi bahsetmek açısından bir örnek yapalım.
Scope dışına bunları tanımlayalım,
SqlConnection cnn;
SqlCommand cmd;
SqlDependency dep;
SqlDataAdapter da;
DataTable dt;
Şimdi ise Button nesnemizin click olayına yazacağımız kodlardan bahsedelim.
private void btnlistele_Click(object sender, EventArgs e)
{
con = new SqlConnection(“data source=.;initial catalog=Teknik;integrated security=SSPI”);
con.Open();
cmd = new SqlCommand(“Select a.ArizaId, a.UrunId from[dbo].[Ariza] “, cnn); // veriyi çekeceğiniz sorgumuzu yazıyoruz.
dep = new SqlDependency(cmd);
SqlDependency.Start(“data source=.;initial catalog=Teknik;integrated security=SSPI”);
dep.OnChange+=new OnChangeEventHandler(dep_OnChange);
da = new SqlDataAdapter(cmd);
dt = new DataTable();
da.Fill(dt);
dgVeriler.DataSource = dt;
cnn.close();
}
void dep_OnChange(object sender, SqlNotificationEventArgs e)
{
MessageBox.Show(“Veriler eklendi.”);
}
Veritabanına aşağıdaki kodu yazmazsanız eğer hata verir çalışmaz.
ALTER DATABASE [Teknik] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
Arkadaşlar burada bahsettik avantajları var güzel fakat dezavantajları da vardır.Sql serverimizi sürekli çalışır durumda tutar sürekli işlem yapar ve sunucu tarafında yavaşlama olur buda bizim performansımızı düşürür.Kullanmak sizin tercihinize kalmış.Bunu kullanmak yerine entity framework orm aracını kullanabilirsiniz.Hem daha az kod yazarsınız.Sunucu sürekli çalışmaz.