﻿
{"id":193,"date":"2012-03-15T22:21:35","date_gmt":"2012-03-15T22:21:35","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=193"},"modified":"2012-04-27T16:44:56","modified_gmt":"2012-04-27T16:44:56","slug":"ado-net-connected-mimari-sqlcommand-ve-sqldatareader-nesneleri","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/ado-net-connected-mimari-sqlcommand-ve-sqldatareader-nesneleri\/","title":{"rendered":"ADO.NET Connected Mimari-SqlCommand ve SqlDataReader Nesneleri"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bu yaz\u0131m\u0131zda SqlCommand ve SqlDataReader nesnelerinin kullan\u0131m\u0131n\u0131 g\u00f6rece\u011fiz.Ba\u011flant\u0131 yapt\u0131\u011f\u0131m\u0131z veritaban\u0131 \u00fczerinde sorgu \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flayan s\u0131n\u0131f SqlCommand s\u0131n\u0131f\u0131d\u0131r.<br \/>\n<!--more--><strong><span style=\"color: #ff0000;\">SqlCommand Nesnesi<\/span><\/strong><br \/>\nSqlCommand nesnesi sayesinde ba\u011flant\u0131 yapt\u0131\u011f\u0131m\u0131z veritaban\u0131 \u00fczerinden sorgu \u00e7al\u0131\u015ft\u0131rabiliriz.Sorgunun tipine g\u00f6re(select,insert,update,delete) \u00e7al\u0131\u015ft\u0131rma \u00e7e\u015fitlili\u011fi g\u00f6steriyor.<br \/>\n\u015eimdi bir SqlConnection nesnesi olu\u015fturup veritaban\u0131 ba\u011flant\u0131s\u0131 yapal\u0131m.Ben kendi SQL server\u0131mda Northwind tablosuna ba\u011flant\u0131 kuraca\u011f\u0131m(SqlConnection nesnesine bir \u00f6nceki yaz\u0131mda de\u011finmi\u015ftim.)Ard\u0131ndan SqlCommand nesnesi olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n SqlConnection baglanti = new SqlConnection(&quot;Server=GEN\u00c7AY-GEN\u00c7AY;database=Northwind;Trusted_connection=true;&quot;);\r\n            baglanti.Open();\r\n            SqlCommand cmd = new SqlCommand(&quot;Select * from Personeller&quot;,baglanti);\r\n            baglanti.Close();\r\n            baglanti.Dispose();\r\n<\/pre>\n<p>Yukarda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi SqlCommand nesnesinin constructor\u0131na bir SQL sorgusu birde SqlConnection tipindeki baglant\u0131 referans\u0131 yaz\u0131lm\u0131\u015f.\u00d6ncelikle \u015funu bilmeliyiz.SqlCommand nesnesinin \u00e7al\u0131\u015ft\u0131raca\u011f\u0131 sorgu hangi ba\u011flant\u0131 \u00fczerinden \u00e7al\u0131\u015facakt\u0131r.SqlCommand \u0131m\u0131za bu ba\u011flant\u0131y\u0131 g\u00f6stermemiz gerekiyor.Yukardaki constructor da yapt\u0131\u011f\u0131m\u0131z gibi sorgudan sonra ba\u011flant\u0131y\u0131 verebilirsiniz.Ya da a\u015fa\u011f\u0131daki yollar\u0131 se\u00e7ebilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nSqlCommand cmd = new SqlCommand();\r\ncmd.CommandText = &quot;Select * From Personeller&quot;; \\\\ CommandText \u00f6zelli\u011fine \u00e7al\u0131\u015ft\u0131raca\u011f\u0131m\u0131z sorguyu yazar\u0131z.\r\ncmd.Connection = baglanti; \\\\ Connection \u00f6zelli\u011fine ise SqlConnection tipinden olan ba\u011flant\u0131m\u0131z\u0131 g\u00f6steririz.\r\n<\/pre>\n<p>Ba\u011flant\u0131 olu\u015fturulduktan sonra sorgumuzu \u00e7al\u0131\u015ft\u0131rmam\u0131z(Execute) etmemiz gerekir.Bunun i\u00e7in SqlCommand nesnesinin Execute metodlar\u0131n\u0131 kullan\u0131l\u0131r.<br \/>\nBu metodlar \u015funlard\u0131r;<br \/>\nExecuteNonQuery = Geriye int d\u00f6nen bir metoddur.Genellikle insert,delete,update sorgular\u0131 \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.Sorgunun \u00e7al\u0131\u015fmas\u0131 sonucunda ka\u00e7 kay\u0131t etkilenmi\u015f(T-SQL de @@ROWCOUNT) o de\u011feri int olarak geri d\u00f6nd\u00fcr\u00fcr.<br \/>\nExecuteReader = Genellikle select sorgular\u0131n da kullan\u0131l\u0131r.Arka planda sorguyu \u00e7al\u0131\u015ft\u0131r\u0131r ve gelen verileri SqlDataReader nesnesine y\u00fckler ve bize o nesneyi geri g\u00f6nderir.Bu sonucu okumam\u0131z i\u00e7in SqlDataReader referans\u0131na bu sonucu al\u0131p,a\u00e7\u0131k bir ba\u011flant\u0131 i\u00e7inde sat\u0131r sat\u0131r okumam\u0131z gerekir.<br \/>\nExecuteScalar = Genelde select sorgular\u0131nda kullan\u0131l\u0131r.Verilen sorguyu \u00e7al\u0131\u015ft\u0131r\u0131r ve sorgu sonucunda olu\u015fan kay\u0131t k\u00fcmesinin ilk sat\u0131r ve ilk s\u00fctununu object tipte geri g\u00f6nderir.<br \/>\nExecuteXmlReader = Select sorgusunun sonucunu xml format\u0131nda XmlReader nesnesine y\u00fckleyerek, o nesneyi geri d\u00f6ner.<\/p>\n<p>\u015eimdi sorgumuzu ExecuteReader ile \u00e7al\u0131\u015ft\u0131ral\u0131m ve SqlDataReader nesnesinin kullan\u0131m\u0131n\u0131da g\u00f6rm\u00fc\u015f oluruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nSqlConnection baglanti = new SqlConnection(&quot;Server=GEN\u00c7AY-GEN\u00c7AY;database=Northwind;Trusted_connection=true;&quot;);\r\nbaglanti.Open();\r\nSqlCommand cmd = new SqlCommand(&quot;Select Adi,Soyadi from Personeller&quot;,baglanti);\r\nSqlDataReader dt = cmd.ExecuteReader(); \\\\SqlDataReader referans\u0131na cmd.ExecuteReader() ba\u011fl\u0131yoruz.\u00c7\u00fcnk\u00fc cmd.ExecuteReader() bir SqlDataReader nesnesi d\u00f6n\u00fcyor.Yani nesne d\u00f6nd\u00fc\u011f\u00fc i\u00e7in referansa bu nesneyi tan\u0131mlam\u0131\u015f oluyoruz.\r\nbaglanti.Close();\r\nbaglanti.Dispose();\r\n<\/pre>\n<p>\u015eimdi SqlDataReader nesnesinden verileri okumay\u0131 g\u00f6relim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndt.Read();\r\n<\/pre>\n<p>Read() metodu,dt i\u00e7inde kay\u0131t k\u00fcmesinde e\u011fer varsa ilk kayd\u0131 okur,sonra imleci e\u011fer varsa sonraki kay\u0131t \u00fczerinde konumland\u0131r\u0131r.E\u011fer okuyabilece\u011fi kay\u0131t varsa geriye True,yoksa false d\u00f6ner.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n while (dt.Read())\r\n            {\r\n                MessageBox.Show(dt&#x5B;&quot;Adi&quot;].ToString() + &quot; &quot; + dt&#x5B;&quot;Soyadi&quot;].ToString());\r\n                \\\\Bu d\u00f6ng\u00fc dt i\u00e7indeki kay\u0131t say\u0131s\u0131 kadar d\u00f6necektir.\r\n                \\\\dt den okuma i\u015flemi dt&#x5B;&quot;Adi&quot;] bu \u015fekilde yap\u0131labilir.Sorgu sonucu gelen kolonun ismini yazabiliriz.Ya da indeks numaras\u0131na g\u00f6re yazabiliriz.\r\n                \\\\dr.GetString(0) + &quot; - &quot; + dr.GetString(1) bu \u015fekildede verileri \u00e7ekebiliriz.Verilerin tipinin string oldu\u011funu bildi\u011fim i\u00e7in GetString metodunu kulland\u0131m.E\u011fer int olsayd\u0131 GetInt32() metodunu kullan\u0131rd\u0131m.\r\n            }\r\n<\/pre>\n<p>Not : Nesnelerle i\u015fimiz bitti\u011fi zaman onlar\u0131 Dispose() etmemiz faydal\u0131 olacakt\u0131r.SqlDataReader \u0131 manuel olarak Dispose etmemiz baz\u0131 aksakl\u0131klara yol a\u00e7abilir.Ancak a\u015fa\u011f\u0131daki \u015fekilde CommandBehavior.CloseConnection eklersek, SqlDataReader nesnemizle i\u015fimiz bitti\u011finde dinamik olarak kendisi dispose olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nSqlDataReader dt = cmd.ExecuteReader(CommandBehavior.CloseConnection);\r\n<\/pre>\n<p>Her zamanda DataReader nesnemizi bodoslama d\u00f6ng\u00fcye sokmak pek iyi de\u011fildir.\u00d6nce DataReader nesnemizin i\u00e7inde veri var m\u0131 yok mu onu kontrol edelim e\u011fer varsa d\u00f6ng\u00fcye girsin.Bunuda HasRowns \u00f6zelli\u011fi ile kontrol ediyoruz.E\u011fer kay\u0131t varsa True d\u00f6ner, yoksa false d\u00f6ner.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nif (dt.HasRows)\r\n            {\r\n                while (dt.Read())\r\n                {\r\n                    MessageBox.Show(dt&#x5B;&quot;Adi&quot;].ToString());\r\n                }\r\n            }\r\n            else\r\n            {\r\n\r\n            }\r\n<\/pre>\n<hr \/>\n<p>Ek olarak SqlDataReader nesnemizle ilgili performans\u0131 \u00e7ok artt\u0131ran bir durumdan bahsedece\u011fim.E\u011fer Select sorgusundan tek sat\u0131r d\u00f6nece\u011finden eminsek e\u011fer a\u015fa\u011f\u0131daki i\u015flem performans\u0131 artt\u0131racakt\u0131r.<br \/>\nA\u015fa\u011f\u0131daki \u00f6rnekte sonucu tek sat\u0131r d\u00f6nen select sorgusu mevcuttur.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            SqlConnection baglanti = new SqlConnection(&quot;Server=GEN\u00c7AY-GEN\u00c7AY;database=northwind;trusted_connection=true;&quot;);\r\n            SqlCommand cmd = new SqlCommand(&quot;Select Count(*),AVG(PersonelId) from Personeller&quot;,baglanti);\r\n            baglanti.Open();\r\n            SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection | CommandBehavior.SingleRow);\r\n            dr.Read();\r\n            MessageBox.Show(dr&#x5B;0] + &quot; &quot; + dr&#x5B;1]);\r\n            baglanti.Close();\r\n<\/pre>\n<p>Not : ExecuteReader() metoduna CommandBehavior enum tipinden birden fazla de\u011feri ayn\u0131 anda verebiliriz(Enumlardan ilerideki yaz\u0131lar\u0131mda bahsedece\u011fim)Bunun i\u00e7in &#8220;|(pipe)&#8221; kullanabiliriz.Enum tipten birden fazla de\u011feri ayn\u0131 anda bu \u015fekilde di\u011fer metodlara da ge\u00e7irmek m\u00fcmk\u00fcnd\u00fcr.<br \/>\nYukar\u0131daki kod blo\u011funda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi,cmd.ExecuteReader(CommandBehavior.CloseConnection | CommandBehavior.SingleRow) kodundaki CommandBehavior.SingleRow komutu performans\u0131 artt\u0131rmaktad\u0131r.<br \/>\nCommandBehavior.CloseConnection&#8217;un ne oldu\u011funu zaten biliyoruz.CommandBehavior.SingleRow&#8217;u a\u00e7\u0131klayay\u0131m.<br \/>\nCommandBehavior.SingleRow : E\u011fer ExecuteReader() metodunun okuyaca\u011f\u0131 sonu\u00e7 k\u00fcmesi sadece tek sat\u0131rdan olu\u015fuyorsa,bu \u00f6zelli\u011fi kullanmak performans\u0131 art\u0131racakt\u0131r.Normalde arkaplanda gelecek olan sonu\u00e7 k\u00fcmesi i\u00e7in bir koleksiyon olu\u015fturulur.Veriler okunur ve o olu\u015fturulan koleksiyona y\u00fcklenirler.Oradan da bize g\u00f6nderilirler.Tek sat\u0131rl\u0131k bir veri i\u00e7in bu kadar i\u015fleme gerek yoktur.E\u011fer bu gibi durumlar da bu \u00f6zelli\u011fi kullanmazsak,tek sat\u0131rl\u0131k veri i\u00e7inde bu i\u015flemler ger\u00e7ekle\u015ftirilecek ve performans d\u00fc\u015f\u00fc\u015f\u00fcne sebep olacakt\u0131r.Biz bu \u00f6zellik sayesinde tek d\u00f6nen verinin tek sat\u0131r olaca\u011f\u0131n\u0131 s\u00f6yl\u00fcyoruz ona g\u00f6re i\u015flemcimizi yordurmuyoruz.<\/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>Bu yaz\u0131m\u0131zda SqlCommand ve SqlDataReader nesnelerinin kullan\u0131m\u0131n\u0131 g\u00f6rece\u011fiz.Ba\u011flant\u0131 yapt\u0131\u011f\u0131m\u0131z veritaban\u0131 \u00fczerinde sorgu \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flayan s\u0131n\u0131f SqlCommand s\u0131n\u0131f\u0131d\u0131r.<!-- 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":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,22],"tags":[129,131,133,134],"class_list":["post-193","post","type-post","status-publish","format-standard","hentry","category-c-sharp-c","category-veritabani","tag-ado-net","tag-connected","tag-sqlcommand","tag-sqldatareader"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/193","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=193"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/193\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}