﻿
{"id":4549,"date":"2016-06-26T04:31:27","date_gmt":"2016-06-26T04:31:27","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4549"},"modified":"2016-06-26T04:31:57","modified_gmt":"2016-06-26T04:31:57","slug":"c-sqldependency-ile-query-notification","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-sqldependency-ile-query-notification\/","title":{"rendered":"C# &#8211; SqlDependency \u0130le Query Notification"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>\u00dczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z projenin veritaban\u0131 k\u0131sm\u0131nda neler olup bitti\u011fini \u00e7al\u0131\u015fma zaman\u0131nda takip etmek istiyorsan\u0131z ve bu i\u015flemi asenkron yap\u0131ya el s\u00fcrmeden ger\u00e7ekle\u015ftirmek istiyorsan\u0131z e\u011fer i\u015fte bu i\u00e7eri\u011fimizde tamda bu konu \u00fczerine konu\u015faca\u011f\u0131z.<\/p>\n<p>Herhangi bir T zaman\u0131nda veritaban\u0131m\u0131zda ne gibi de\u011fi\u015fim ve geli\u015fim oldu\u011funu, verilerin eklenme, silinme ve g\u00fcncellenme durumlar\u0131n\u0131, tablolar \u00fczerinde yap\u0131lacak fiziksel ayarlar\u0131, SQL sunucusunun yeniden ba\u015flat\u0131lmas\u0131 yahut sunucu \u00fczerinde olu\u015fan hatalar nedeniyle sunucunun durdurulmas\u0131 vs. vs. gibi i\u015flemleri SqlDependency s\u0131n\u0131f\u0131 arac\u0131l\u0131\u011f\u0131yla kontrol edebilmekte ve bunu birazdan g\u00f6rece\u011finiz \u00fczere \u00e7ok ama \u00e7ok basit bir yap\u0131yla ger\u00e7ekle\u015ftirebilmekteyiz.<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4552 size-full\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification.jpg\" alt=\"ADO.NET - SqlDependency \u0130le Query Notification\" width=\"561\" height=\"433\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification.jpg 561w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-300x232.jpg 300w\" sizes=\"auto, (max-width: 561px) 100vw, 561px\" \/><\/a><\/p>\n<p>\u00d6ncelikle yukar\u0131daki forma \u00f6zel a\u015fa\u011f\u0131daki kod blo\u011funu inceleyiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void btnPersonelleriGoster_Click(object sender, EventArgs e)\r\n        {\r\n            SqlConnection baglanti = new SqlConnection(&quot;Server=.;Database=Northwind;Trusted_Connection=True;&quot;);\r\n            SqlCommand cmd = new SqlCommand(&quot;Select PersonelID, Adi, SoyAdi, Unvan from dbo.Personeller&quot;, baglanti);\r\n            if (baglanti.State == ConnectionState.Closed)\r\n                baglanti.Open();\r\n\r\n            #region Dependency\r\n            SqlDependency dependency = new SqlDependency(cmd);\r\n            SqlDependency.Start(baglanti.ConnectionString);\r\n\r\n            dependency.OnChange += Dependency_OnChange; \r\n            #endregion\r\n\r\n            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);\r\n            DataTable Personeller = new DataTable();\r\n            Personeller.Load(dr);\r\n\r\n            dgvPersoneller.DataSource = null;\r\n            dgvPersoneller.DataSource = Personeller;\r\n\r\n            baglanti.Dispose();\r\n            cmd.Dispose();\r\n        }\r\n\r\n        private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)\r\n        {\r\n            MessageBox.Show(&quot;Veriler g\u00fcncellenmi\u015ftir...&quot;);\r\n        }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, butona t\u0131kland\u0131\u011f\u0131 zaman Northwind veritaban\u0131na ba\u011flant\u0131 kurulmakta ve Personeller tablosu \u00e7ekilmektedir. Ama dikkat ederseniz arada SqlDependency s\u0131n\u0131f\u0131 ile bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirilmi\u015ftir. \u015eimdi gelin bu \u00e7al\u0131\u015fmada neler yap\u0131lm\u0131\u015f, ne ama\u00e7la yap\u0131lm\u0131\u015f t\u00fcm mant\u0131\u011f\u0131yla ortaya koyal\u0131m.<\/p>\n<p>SqlDependency s\u0131n\u0131f\u0131, SqlCommand nesnesi ile \u00e7al\u0131\u015fan bir \u00f6zelli\u011fe sahiptir. Verilen SqlCommand nesnesine \u00f6zel bir Notification nesnesi \u00fcretir ve sunucuya bunu kaydeder. Bu i\u015flemden sonra SqlCommand nesnesindeki sorgunun tablosunu belle\u011fe ta\u015f\u0131r ve orada tutar. SQL Server Sunucusu belle\u011fe al\u0131nan tablo ile fiziksel tablo aras\u0131nda kar\u015f\u0131la\u015ft\u0131rmay\u0131 yaparak olas\u0131 de\u011fi\u015fikliklerde SqlDependency nesnesindeki OnChange olay\u0131n\u0131 tetikler. Tabi bu s\u00fcrecin y\u00fcr\u00fct\u00fclmesi i\u00e7inde SqlDependency.Start metodunun sorgular\u0131n veritaban\u0131na g\u00f6nderilmesinden \u00f6nce \u00e7a\u011fr\u0131lm\u0131\u015f olmas\u0131 gerekmektedir.<\/p>\n<p>Burada dikkat etmeniz gereken iki husus vard\u0131r&#8230;<br \/>\nBirincisi;<br \/>\nKullan\u0131lacak SqlCommand nesnesine<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nSelect * from Bilmemne\r\n<\/pre>\n<p>gibi lalettayin bir sorgu veremezsiniz. Sorgunun kolon isimleri ve tablonunda \u015fablon ad\u0131 a\u00e7\u0131k bir \u015fekilde belirtilmi\u015f olmas\u0131 gerekmektedir. Yukar\u0131daki \u00f6rne\u011fe dikkat ederseniz bu \u015fartlara uygun bir select sorgusu belirtilmi\u015ftir.<\/p>\n<p>Ayriyetten SqlCommand nesnesi tetikletilip veritaban\u0131na g\u00f6nderilmelidir. Bu ad\u0131mdan sonra SqlCommand&#8217;da ki sorguya \u00f6zel tablo belle\u011fe ta\u015f\u0131nacak ve o SqlCommand&#8217;a \u00f6zel bir durum olacakt\u0131r. Buda ikincisidir.<\/p>\n<p>Yukar\u0131daki \u00f6rnek kod blo\u011funun \u00e7al\u0131\u015ft\u0131r\u0131lm\u0131\u015f hali a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-1-300x114.jpg\" alt=\"ADO.NET - SqlDependency \u0130le Query Notification\" width=\"300\" height=\"114\" class=\"aligncenter size-medium wp-image-4559\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-1-300x114.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-1.jpg 440w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-2-300x233.jpg\" alt=\"ADO.NET - SqlDependency \u0130le Query Notification\" width=\"300\" height=\"233\" class=\"aligncenter size-medium wp-image-4560\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-2-300x233.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-2.jpg 543w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nG\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi veritaban\u0131nda yap\u0131lan de\u011fi\u015fiklik sunucu taraf\u0131ndan anl\u0131k olarak bellekteki sorgu sonucu tabloyla k\u0131yasland\u0131 ve benzersizlik fark edilerek an\u0131nda OnChange olay\u0131 tetiklenmi\u015ftir.<\/p>\n<p>Bu i\u015flemden sonra veritaban\u0131ndaki ba\u015fka bir veriyi g\u00fcncelledi\u011fimiz zaman OnChange olay\u0131 tetiklenmemektedir. E\u011fer ki, ilk \u00e7al\u0131\u015fmadan sonraki t\u00fcm ad\u0131mlarda OnChange olay\u0131n\u0131n tetiklenmesini istiyorsan\u0131z a\u015fa\u011f\u0131daki gibi hareket edebilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        SqlConnection baglanti;\r\n        SqlCommand cmd;\r\n        SqlDependency dependency;\r\n\r\n        void Dependency()\r\n        {\r\n            dependency = new SqlDependency(cmd);\r\n            SqlDependency.Start(baglanti.ConnectionString);\r\n\r\n            dependency.OnChange += Dependency_OnChange;\r\n        }\r\n<\/pre>\n<p>Yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi \u00f6ncelikle Dependency i\u015flemini yapacak komutlar\u0131m\u0131z\u0131 ayr\u0131 bir metoda alal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        void PersonelleriGetir()\r\n        {\r\n            try\r\n            {\r\n                baglanti = new SqlConnection(&quot;Server=.;Database=Northwind;Trusted_Connection=True;&quot;);\r\n                cmd = new SqlCommand(&quot;Select PersonelID, Adi, SoyAdi, Unvan from dbo.Personeller&quot;, baglanti);\r\n                if (baglanti.State == ConnectionState.Closed)\r\n                    baglanti.Open();\r\n\r\n                Dependency();\r\n\r\n                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);\r\n                DataTable Personeller = new DataTable();\r\n                Personeller.Load(dr);\r\n\r\n                dgvPersoneller.DataSource = null;\r\n                dgvPersoneller.DataSource = Personeller;\r\n\r\n                baglanti.Dispose();\r\n                cmd.Dispose();\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n        }\r\n<\/pre>\n<p>Ard\u0131ndan veritaban\u0131 i\u015flemlerimizi yapan komutlar\u0131m\u0131z\u0131da yukar\u0131daki gibi farkl\u0131 bir metoda alabilir, i\u00e7erisinde uygun noktada Dependency metodunu \u00e7a\u011f\u0131rabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)\r\n        {\r\n            MessageBox.Show(&quot;Veritaban\u0131 g\u00fcncellenmi\u015ftir. &quot; + e.Info.ToString());\r\n            dependency.OnChange -= Dependency_OnChange;\r\n            PersonelleriGetir();\r\n        }\r\n<\/pre>\n<p>OnChange olay\u0131m\u0131z\u0131 yukar\u0131daki gibi in\u015fa edip, her tetiklenme neticesinde SqlDependency nesnesinin OnChange EventHandler&#8217;\u0131ndan ba\u011fl\u0131 metodu \u00e7\u0131kar\u0131yor ard\u0131ndan PersonelleriGetir metodunu yeniden \u00e7a\u011f\u0131r\u0131yoruz. Bu \u015fekilde PersonelleriGetir metodu global olan cmd referans\u0131na yeni bir SqlCommand nesnesi ba\u011flamakta ve ard\u0131ndan bu nesne ile i\u00e7erisinde Dependency metodunuda tetikleyip dependency referans\u0131nada yeni SqlDependency \u00fcretip ba\u011flanacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void btnPersonelleriGoster_Click(object sender, EventArgs e)\r\n        {\r\n            PersonelleriGetir();\r\n        }\r\n<\/pre>\n<p>Olay\u0131m\u0131z\u0131da bu \u015fekilde kodlamam\u0131z yeterli olacakt\u0131r.<\/p>\n<p>Yani yukar\u0131da yapt\u0131\u011f\u0131m\u0131z i\u015flemin b\u00fct\u00fcnsel halini a\u015fa\u011f\u0131ya al\u0131rsak e\u011fer<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        SqlConnection baglanti;\r\n        SqlCommand cmd;\r\n        SqlDependency dependency;\r\n\r\n        void Dependency()\r\n        {\r\n            dependency = new SqlDependency(cmd);\r\n            SqlDependency.Start(baglanti.ConnectionString);\r\n\r\n            dependency.OnChange += Dependency_OnChange;\r\n        }\r\n        void PersonelleriGetir()\r\n        {\r\n            try\r\n            {\r\n                baglanti = new SqlConnection(&quot;Server=.;Database=Northwind;Trusted_Connection=True;&quot;);\r\n                cmd = new SqlCommand(&quot;Select PersonelID, Adi, SoyAdi, Unvan from dbo.Personeller&quot;, baglanti);\r\n                if (baglanti.State == ConnectionState.Closed)\r\n                    baglanti.Open();\r\n\r\n                Dependency();\r\n\r\n\r\n                SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);\r\n                DataTable Personeller = new DataTable();\r\n                Personeller.Load(dr);\r\n\r\n                dgvPersoneller.DataSource = null;\r\n                dgvPersoneller.DataSource = Personeller;\r\n\r\n                baglanti.Dispose();\r\n                cmd.Dispose();\r\n            }\r\n            catch\r\n            {\r\n\r\n            }\r\n        }\r\n        private void btnPersonelleriGoster_Click(object sender, EventArgs e)\r\n        {\r\n            PersonelleriGetir();\r\n        }\r\n        private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)\r\n        {\r\n            MessageBox.Show(&quot;Veritaban\u0131 g\u00fcncellenmi\u015ftir. &quot; + e.Info.ToString());\r\n            dependency.OnChange -= Dependency_OnChange;\r\n            PersonelleriGetir();\r\n        }\r\n<\/pre>\n<p>bu tarz bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirmeniz \u00e7oklu kullan\u0131m a\u00e7\u0131s\u0131ndan yeterli olacakt\u0131r. Asl\u0131nda temel ama\u00e7, yeni bir SqlCommand \u00fcretip, bir ba\u015fka yeni SqlDependency nesnesine ba\u011flayarak SQL Server sunucusuna g\u00f6ndermek ve s\u00fcreci bu yeni hamlede tekrardan takip etmektir. Ve bunu her ad\u0131mda yapmakt\u0131r&#8230;<\/p>\n<p>Son olarak OnChange olay\u0131n\u0131n SqlNotificationEventArgs parametresine de\u011finerek makalemizi sonland\u0131r\u0131rsak e\u011fer bu parametre, veritaban\u0131nda yap\u0131lan eylemin bilgisini bize getiren ve algoritmay\u0131 buna g\u00f6re \u015fekillendirmemizi sa\u011flayan bir \u00f6zelli\u011fe sahiptir. Hemen \u00fcstteki kodlardan OnChange olay\u0131 i\u00e7erisindeki \u00e7al\u0131\u015fmam\u0131za g\u00f6z atarsan\u0131z e\u011fer a\u015fa\u011f\u0131daki g\u00f6r\u00fcnt\u00fc o noktayla ili\u015fkili bir \u00f6rnek temsil etmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-3-300x153.jpg\" alt=\"ADO.NET - SqlDependency \u0130le Query Notification\" width=\"300\" height=\"153\" class=\"aligncenter size-medium wp-image-4567\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-3-300x153.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/06\/ADO.NET-SqlDependency-\u0130le-Query-Notification-3.jpg 767w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nEkranda da g\u00f6rm\u00fc\u015f oldu\u011funuz gibi veritaban\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lan insert sorgusu neticesinde fiziksel tablonun bellekteki kar\u015f\u0131l\u0131\u011f\u0131 de\u011fi\u015fece\u011finden dolay\u0131 OnChange metodu an\u0131nda tetiklenecek ve bu tetiklenmenin sebebini Insert olarak bizlere getirecektir.<\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, \u00dczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z projenin veritaban\u0131 k\u0131sm\u0131nda neler olup bitti\u011fini \u00e7al\u0131\u015fma zaman\u0131nda takip etmek istiyorsan\u0131z ve bu i\u015flemi asenkron yap\u0131ya el s\u00fcrmeden ger\u00e7ekle\u015ftirmek istiyorsan\u0131z e\u011fer i\u015fte bu i\u00e7eri\u011fimizde tamda bu konu \u00fczerine konu\u015faca\u011f\u0131z. Herhangi bir&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[129,27,1265,1264,1262,1263,1266,1267],"class_list":["post-4549","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-ado-net","tag-c","tag-notification","tag-query","tag-query-notification","tag-sqldependency","tag-sqldependency-start","tag-sqlnotificationeventargs"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=4549"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4549\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4549"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}