SqlDataReadersınıfı hakkında bilgi içeren ve aşağıda verilen metnin ilk kısmını 2003 yılında kaleme almış olmama rağmen 2004 yılı başında basılıp piyasaya verilen ilk Visual Basic .NET kitabımdan aldım. Hem de olduğu gibi, kelimesine dokunmadan. Neden mi buna vurgu yaptım? Çünkü bu metindeki kodların C# karşılıklılarını yine 2004 yılında yayınlanan C# kitabımda kullandım. Başka bir deyişle Visual Basic .NET kitabım için SqlDataReader sınıfı hakkında bilgi vermek amacıyla hazırladığım metni ele alıp içindeki kodları C#'a uyarlayıp C# kitabımda aynen kullandım. Bu makalenin devamında aynı metnin C# kitabımda kullandığım halini de sunacağım. Tabi hemen bazılarınız soracaklardır: Madem Visual Basic ile C# programlama dilleri .NET Framework ile gelen aynı sınıfları kullanıyorlar aynı sınıf hakkında Visual Basic kitabında yazılanlarla C# kitabında yazılanların benzer olması normal değil midir? Bu soruyu soran arkadaşlara cevabım şudur: Haklısınız, Visual Basic .NET kitapları ile C# kitapları birçok yönden birbirine benzerler.
Sizler haklısınız da C# kitabımda SqlDataReader sınıfı hakkında yazdıklarımdan dolayı yargılanıyorum. Yani benim için bu sınıf hakkında bir şeyler yazmak bazen suçtur bazen değildir. Yani .NET yumlu Visual Basic kitabımda bu SqlDataReader sınıfı hakkında bir şeyler yazmış olmam suç değil iken aynı metni küçük değişikliklerle C# kitabımda kullanmış olmam bazılarına göre suç teşkil ediyor? Lütfen gülmeyiniz. Sanırım ilgililer yani SqlDataReader sınıfı hakkında bir şeyler yazma hakkı olanlar bana bu sınıf hakkında bir şeyler yazma hakkını bir(1) kez vermişler. Bu hakkı .NET uyumlu Visual Basic kitabımda kullandığım için aynı sınıf hakkında C# kitabımda bilgi vermeme itiraz etmişlerdir. Belki bu kara mizah durumdan recep ivedik’i haberdar etmek gerek. Bu arada bu komedinin başrollerin birinde Prof unvanlı bir öğretim üyesinin olduğunu bilmekte fayda var.
SqlDataReader ve SqlCommand Nesnesi İle Bilgileri Okumak - Visual Basic İçin
SqlConnection ile bağlanılan veritabanındaki bilgilere DataAdapter veya DataReader nesneleri sayesinde erişip bu bilgileri başka amaçlarla kullanabilirsiniz. Yukarıda hazırlamış olduğum Connection nesnesi ile erişilen veritabanındaki bilgileri SqlDataReader nesnesine aktaracağım. Bu amaçla “Okuyucu” adında bir SqlDataReader nesnesi tanımladım.
Dim Okuyucu As SqlDataReader = Nothing
SqlDataReader nesnesi ile veritabanından bilgi alabilmek için SqlCommand nesnesine gerek duyulur. Bu amaçla aşağıda verdiğim ilk satır ile SqlCommand nesnesi için değişken tanımladım. SqlCommand nesnesi, veritabanından okunacak bilgiler konusunda SQL koduna gerek duyar. Bu nedenle SQL kodu aktarmak üzere bir değişken tanımladım ve bu değişkene SELECT deyiminin kullanıldığı bir SQL satırı aktardım.
Dim Komut As SqlCommand
Dim Komut_metni As String
Komut_metni = "SELECT * From Musteriler"
Command nesnesine aktarılacak SQL kodunu bu şekilde hazırladıktan sonra aşağıda verdiğim satır ile SqlCommand nesnesini hazırladım. Bu satır işletildiğinde SQL kodu aktarılan “Komut_metni” değişkenin içeriği Command nesnesinin CommandText özelliğine aktarılır.
Komut = New SqlCommand(Komut_metni, Baglanti)
Şimdiye kadar hazırlamış olduğum satırları Form_Load() yordamına yazdım. Bu yordam sayesinde proje çalıştırıldığında BILGISAYAR2’deki “Cari” adındaki SQL Server veritabanına bağlanılır ve bu veritabanındaki “Musteriler” tablosundaki bütün kayıtlara erişime imkan sağlayacak Command nesnesi hazırlanır.
Bu yordamda kod yazılarak New metodu sayesinde hem Connection hem de Command nesnesi hazırlanmaktadır. Ancak aynı durum DataReader nesnesi için geçerli değildir. Çünkü New metodu ile DataReader nesnesi hazırlanamıyor. Örneğin aşağıdaki gibi 2 satır yazarsanız hata meydana gelir.
Dim Okuyucu As SqlDataReader = Nothing
Okuyucu = New SqlDataReader()
SqlDataReader nesnesi ancak Command nesnesinin ExecuteReader() metodu kullanılarak oluşturulabilinir. Bu nedenle yukarıda verdiğim yordama aşağıda verdiğim satırı ekledim. Bu satır sayesinde “Okuyucu” adını vermiş olduğum SqlDataReader nesnesi hazırlanır. ExecuteReader() metodu ile DataReader nesnesi hazırlanırken Command nesnesinin CommandText özelliğine aktarılan SQL kodu işletilir.
Okuyucu = Komut.ExecuteReader()
Read() Metodu İle DataReader’dan Kayıt Okumak
DataReader nesnesindeki bilgileri okumak veya başka bir deyişle kayıtların üzerine gitmek için Read() metodu kullanılmaktadır. Read() metodu her seferinde DataReader nesnesindeki bir sonraki kaydı geçerli kayıt yapar. En son kaydın üzerinde iken Read() metodu tekrar işletildiğinde geriye False bilgisi gönderilir.
Tablodan okunacak bilgileri bir liste kutusunda listelemek için forma bir ListBox nesnesi yerleştirdim yukarıda verdiğim Form_Load() yordamına aşağıda verdiğim 3 satırı ekledim. Bu 3 satır sayesinde “Okuyucu” adını vermiş olduğum DataReader nesnesinin bütün kayıtları sıra ile okunup ListBox’a eklenir.
While Okuyucu.Read
ListBox1.Items.Add(Okuyucu.GetString(0))
End While
SqlDataReader nesnesine SqlCommand nesnesi sayesinde aktarılmış olan bütün kayıtlar okunduğunda Read() metodu geriye False değerini göndereceği için yukarıda verilen While-End While döngüsünden çıkılır. Form_Load() yordamı yukarıda verilen şekilde düzenlenen proje çalıştırıldığında aşağıdaki gibi bir sonuç elde edilir.
DataReader nesnesinden ListBox nesnesine bilgi aktarılırken GetString() metodu kullanılıyor. GetString() metodu içeriği okunacak alanın sıra numarasını parametre olarak almaktadır. Yukarıda GetString() metoduna ilk alanın sıra numarası(0) verildiği için tablodaki ilk alanın içeriği ListBox’a aktarıldı. Tablodaki bütün alanların içeriğini ListBox’a aktarmak için yukarıda verdiğim kodu aşağıdaki gibi düzenledim.
Dim Baglanti As SqlConnection
Dim Baglanti_metni As String
Dim Komut As SqlCommand
Dim Komut_metni As String
Dim Okuyucu As SqlDataReader = Nothing
Dim Segment1, Segment2, Segment3 As String
Dim Segment4, Segment5, Segment6 As String
Segment1 = "workstation id=BILGISAYAR2;"
Segment2 = "packet size=4096;"
Segment3 = "integrated security=SSPI;"
Segment4 = "data source=BILGISAYAR2\VSdotNET;"
Segment5 = "persist security info=False;"
Segment6 = "initial catalog=Cari"
Baglanti_metni=Segment1+Segment2+Segment3+Segment4+Segment5+Segment6
Baglanti = New SqlConnection(Baglanti_metni)
Baglanti.Open()
Komut_metni = "SELECT * From Musteriler"
Komut = New SqlCommand(Komut_metni, Baglanti)
Okuyucu = Komut.ExecuteReader()
Dim Satir_no As Integer
Dim Satir As String
While Okuyucu.Read
For Satir_no = 0 To 3
Satir = Satir + " " + Trim(Okuyucu.GetString(Satir_no))
Next Satir_no
ListBox1.Items.Add(Satir)
Satir = ""
End While
İçeriğini Command nesnesi ile DataReader nesnesine aktarmış olduğum tabloda 4 alan olduğu için For-Next döngüsünün döngü değişkenine ilk değer olarak 0 ve son değer olarak 3 sayısını aktardım. Bu şekilde düzenlediğim yordamı işletince aşağıdaki gibi bir sonuç aldım.
Şimdi ise DataReader nesnesine ilgili tablonun bütün alanları yerine Ad, Telefon ve Şehir alanlarının aktarılmasını sağlayacağım. Bu amaçla Command nesnesine 1. parametre olarak verilen SQL kodunu aşağıdaki gibi düzenledim. Bu kez DataReader nesnesi 3 alana sahip olacağı için GetString() metodu ile okuma yapılıp ListBox’a bilgi aktarmak amacıyla hazırlanan For-Next döngüsünün son değeri 2 olmalıdır.
Komut_metni = "SELECT Ad, Telefon, Sehir From Musteriler"
SqlDataReader ve SqlCommand Nesnesi İle Bilgileri Okumak – C# İçin
SqlConnection ile bağlanılan veritabanındaki bilgilere DataAdapter veya DataReader nesneleri sayesinde erişip bu bilgileri başka amaçlarla kullanabilirsiniz. Veritabanından yalnızca okuma yapacaksanız, başka bir deyişle mevcut bilgilerde değişiklik yapmayacaksanız DataReader nesnesini kullanabilirsiniz.
Şimdi yukarıda hazırlamış olduğum Connection nesnesi ile erişilen veritabanındaki bilgileri SqlDataReader nesnesine aktaracağım. Bu amaçla “Okuyucu” adında bir SqlDataReader nesnesi tanımladım.
SqlDataReader Okuyucu;
SqlDataReader nesnesi ile veritabanından bilgi alabilmek için SqlCommand nesnesine gerek duyulur. Bu amaçla aşağıda verdiğim ilk satır ile SqlCommand nesnesi için değişken tanımladım. SqlCommand nesnesi, veritabanından okunacak bilgiler konusunda SQL koduna gerek duyar. Bu nedenle SQL kodu aktarmak üzere bir değişken tanımladım ve bu değişkene SELECT deyiminin kullanıldığı bir SQL satırı aktardım.
SqlCommand Komut;
string Komut_metni;
Komut_metni = "SELECT * From Musteriler";
Command nesnesine bu şekilde SQL kodu aktarıldıktan sonra aşağıda verdiğim satır ile SqlCommand nesnesini hazırladım. Bu satır işletildiğinde SQL kodu aktarılan “Komut_metni” değişkenin içeriği Command nesnesinin CommandText özelliğine aktarılır.
Komut = new SqlCommand(Komut_metni, Baglanti);
Şimdiye kadar hazırlamış olduğum satırları Form_Load() yordamına yazdım. Bu yordam sayesinde proje çalıştırıldığında BILGISAYAR2’deki “Cari” adındaki SQL Server veritabanına bağlanılır ve bu veritabanındaki “Musteriler” tablosundaki bütün kayıtlara erişime imkan sağlayacak Command nesnesi hazırlanır.
Bu yordamda kod yazılarak new metodu(new metod yerine aslında yapıcı metot demek gerek) sayesinde hem Connection hem de Command nesnesi hazırlanmaktadır. Ancak aynı durum DataReader nesnesi için geçerli değildir. Çünkü new metodu ile DataReader nesnesi hazırlanamıyor. Örneğin aşağıdaki gibi 2 satır yazarsanız hata meydana gelir.
SqlDataReader Okuyucu;
Okuyucu = new SqlDataReader()
SqlDataReader nesnesi ancak Command nesnesinin ExecuteReader() metodu kullanılarak oluşturulabilinir. Bu nedenle yukarıda verdiğim yordama aşağıda verdiğim satırı ekledim. Bu satır sayesinde “Okuyucu” adını vermiş olduğum SqlDataReader nesnesi hazırlanır. ExecuteReader() metodu ile DataReader nesnesi hazırlanırken Command nesnesinin CommandText özelliğine aktarılan SQL kodu işletilir.
Okuyucu = Komut.ExecuteReader();
Read() Metodu İle DataReader’dan Kayıt Okumak – C# İçin
DataReader nesnesindeki bilgileri okumak veya başka bir deyişle kayıtların üzerine gitmek için Read() metodu kullanılmaktadır. Read() metodu her seferinde DataReader nesnesindeki bir sonraki kaydı geçerli kayıt yapar. En son kaydın üzerinde iken Read() metodu tekrar işletildiğinde geriye False bilgisi gönderilir.
Tablodan okunacak bilgileri bir liste kutusunda listelemek için forma bir ListBox nesnesi yerleştirdim yukarıda verdiğim Form_Load() metoduna aşağıda verdiğim satırları ekledim. Bu satırlar sayesinde “Okuyucu” adını vermiş olduğum DataReader nesnesinin bütün kayıtları sıra ile okunup ListBox’a eklenir.
while (Okuyucu.Read())
{
listBox1.Items.Add(Okuyucu.GetString(0));
}
SqlDataReader nesnesine SqlCommand nesnesi sayesinde aktarılmış olan bütün kayıtlar okunduğunda Read() metodu geriye False göndereceği için yukarıda verilen while döngüsünden çıkılır. Form_Load() yordamı yukarıda verilen şekilde düzenlenen proje çalıştırıldığında aşağıdaki gibi bir sonuç elde edilir.
DataReader nesnesinden ListBox nesnesine bilgi aktarılırken GetString() metodu kullanılıyor. GetString() metodu, içeriği okunacak alanın sıra numarasını parametre olarak almaktadır. Yukarıda GetString() metoduna ilk alanın sıra numarası(0) verildiği için tablodaki ilk alanın içeriği ListBox’a aktarıldı. Tablodaki bütün alanların içeriğini ListBox’a aktarmak için yukarıda verdiğim kodu aşağıdaki gibi düzenledim.
private void Form1_Load(object sender, System.EventArgs e)
{
SqlConnection Baglanti;
string Baglanti_metni;
SqlDataReader Okuyucu;
SqlCommand Komut;
string Komut_metni;
string Segment1;
string Segment2;
string Segment3;
string Segment4;
string Segment5;
string Segment6;
Segment1 = "workstation id=BILGISAYAR2;";
Segment2 = "packet size=4096;";
Segment3 = "integrated security=SSPI;";
Segment4 = "data source=BILGISAYAR2;";
Segment5 = "persist security info=False;";
Segment6 = "initial catalog=Cari";
Baglanti_metni=Segment1+Segment2+Segment3+
Segment4+Segment5+Segment6;
Baglanti = new SqlConnection(Baglanti_metni);
Baglanti.Open();
Komut_metni= "SELECT * From Musteriler";
Komut = new SqlCommand(Komut_metni, Baglanti);
Okuyucu = Komut.ExecuteReader();
string Satir = "";
while (Okuyucu.Read())
{
for(int i=0; i<4; i++)
Satir = Satir + " " + Okuyucu.GetString(i).Trim();
listBox1.Items.Add(Satir);
Satir = "";
}
}
İçeriğini Command nesnesi ile DataReader nesnesine aktarmış olduğum tabloda 4 alan olduğu için for döngüsünün döngü değişkenine ilk değer olarak 0 ve son değer olarak 3 sayısını aktardım. Bu şekilde düzenlediğim yordamı işletince yandaki gibi bir sonuç aldım.
Şimdi ise DataReader nesnesine ilgili tablonun bütün alanları yerine Ad, Telefon ve Şehir alanlarının aktarılmasını sağlayacağım. Bu amaçla Command nesnesine 1. parametre olarak verilen SQL kodunu aşağıdaki gibi düzenledim. Bu kez DataReader nesnesi 3 alana sahip olacağı için GetString() metodu ile okuma yapılıp ListBox’a bilgi aktarmak amacıyla hazırlanan for döngüsünün son değeri 2 olmalıdır.
Komut_metni = "SELECT Ad, Telefon, Sehir From Musteriler"