C# İle SqlDataReader Kullanımı


24 Ekim 2012 Hikmet Okumuş C#

Bir ya da birden fazla satırların sonuç olarak döneceği sorgularda SqlCommand' ın ExecuteReader özelliği kullanılmaktadır. ExecuteReader geriye SqlDataReader tipinde veri döndürmektedir.
SqlDataReader, sadece okunabilir olarak kullanılmaktadır. Satır satır okuma işlemi yapılmaktadır. SqlDataReader kullanımı boyunca veritabanı bağlantısı açık olacaktır. Çünkü SqlDataReader veritabanı ile bağlantılı olarak çalışmaktadır. Okuma işlemi sona erdiğinde SqlDataReader bağlantısınında kapatılması gerekmektedir.
        private void btnDataReader_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(BaglantiAdresi);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "SELECT Adi FROM Kisiler";
            con.Open();

            SqlDataReader dr = cmd.ExecuteReader();

            ArrayList Isimler = new ArrayList();

            while (dr.Read())
            {
                Isimler.Add(dr["Adi"]);
            }

            dr.Close();
            con.Close();
        }
Okuma işlemi SqlDataReader nesnesinin Read() metodu ile yapılmaktadır. Read() metodu geriye bool türünde değer döndürmektedir. Okunacak satır var ise true, yoksa false değerini döndürmektedir.
Bildiğiniz üzere while döngüsü koşul true olduğu sürece icra edilmektedir. Burada da Read() metodu true değerini aldığı sürece işlem görmeye devam edecektir. İşlem sonunda ise SqlDataReader nesnesi Close() metodu ile kapatılmaktadır.

Başarılar dilerim.



Kullanıcı Yorumları

hikmet okumuş makale yorum
Gökhan ARSLAN
5/9/2014 1:07:06 AM

Paylaşım için teşekkür ederiz öncelikle. Bir sorum olacak. Kullanıcı kaydı yaptırıyorum. Yeni kayıtta girilen kullanıcı adının veri tabanımda kayıtlı olup olmadığını nasıl kontrol ettirebilirim? Eğer o kullanıcı adı varsa kaydı yapmayacak. yardımcı olabilir misiniz?

hikmet okumuş makale yorum
Hikmet Okumuş
5/9/2014 10:55:40 AM

Merhaba Gökhan ARSLAN,

Bu kontrolü yapabilmek için öncelikle kendine tablo üzerinde uygun bir alan belirlemelisin. Örnek olarak KİSİLER tablosunda aynı değere sahip olmayacak alanların birisi TC NUMARASI alanı olmalıdır. Yukarıda bahsettiğin gibi eğer aynı TC Numarası ile sisteme yeni bir kayıt eklenmek istenirse sistem uyarı verecek ya da girilen TC Numarası sisteme daha önce hiç eklenmedi ise yeni bir kayıt oluşacak.

Bu uyarlamaya göre aşağıdaki senin için hazırladığım bir metod bulunmakta. Kendine göre revize ederek sorunun cevabını bulabilirsin.

***********************************

public void Insert(int TC_NO, string AD, string SOYAD)
{
OleDbConnection conn = new OleDbConnection(AccessConnString);
OleDbCommand cmd = new OleDbCommand("SELECT COUNT(*) FROM KISILER WHERE TC_NO = @TC", conn);
cmd.Parameters.AddWithValue("@TC", TC_NO);
conn.Open();
int count = (Int32)cmd.ExecuteScalar();

if (count > 0)
{
MessageBox.Show("Sistemde olan bir TC No girdiniz.");
conn.Close();
return;
}

cmd = new OleDbCommand("INSERT INTO KISILER (TC_NO, AD, SOYAD) VALUES (@TC, @AD, @SOYAD)", conn);
cmd.Parameters.AddWithValue("@TC", TC_NO);
cmd.Parameters.AddWithValue("@AD", AD);
cmd.Parameters.AddWithValue("@SOYAD", SOYAD);

cmd.ExecuteScalar();
conn.Close();
MessageBox.Show("Kayıt eklendi.");
}

hikmet okumuş makale yorum
Gökhan ARSLAN
5/11/2014 10:20:04 PM

Hay Allah razı olsun kardeş yaptım oldu sağolasın :) Bir başka sorum daha olabilir mi aceba?
Sorum şöyle:

Benim yapmam gereken projem var bunu da gelir gider otomasyonu olarak belirledim. web uygulamalı olarak yapacağım. isteyen herkes bu sisteme girecek kayıt olabilecek ve kendine ait bir kaydı olacak. gelirini ve giderini kaydedebilecek. bunun için kaydolan her kullanıcıya bir tablo mu açmam gerekir? bilgilerini ayrı ayrı tutmam için.. Bunun cevabını merak ediyorum kardeş şimdiden teşekkür ederim

hikmet okumuş makale yorum
Hikmet Okumuş
5/11/2014 11:08:20 PM

Merhaba Gökhan ARSLAN,

Her bir kullanıcı için ayrı tablolar açman çok yanlış bir yöntem olur. Sisteme kayıtlı kullanıcıları tuttuğun "Kullanıcılar" tablosunda her bir kullanıcıya ait "ID" değerlerin olacaktır. Uygulamanda kullanıcı örnek olarak ödeme yapsın ve kayıt atılacak bu tabloyada biz "Odemeler" diyelim. Bir kullanıcı ödeme yaptığı zaman "Odemeler" tablosuna kayıt atacaksın. Ödemeler tablosuna kayıt atarken geriye dönük izleme açısından atmış olduğun kayıt ile kullanıcıyı ilişkilendirmen gerekmekte. Bunun için "Odemeler" tablosunda "KullanıcıId" gibi bir alan olmalı. Bu alanı işlemi yapan kullanıcının "Id" bilgisi ile setlersen sistemde binlerce kullanıcı işlem yapsın hiç sorun olmaz. Tüm kullanıcıların ödemelerini düzenli bir şekilde tek bir tablo üzerinde tutmuş olursun. Burada en önemli nokta böyle bir sistemi yazmadan önce sistemi kurgulamak. Sistemi doğru kurgulamadıktan sonra ne kadar kaliteli kod yazarsak yazalım her zaman bir yerde eksiklikler olaraktır. Kurgu şemanı tam olarak belirlemeni ve ondan sonra yazılıma dökmeni tavsiye ederim.

Başarılar.

hikmet okumuş makale yorum
Gökhan ARSLAN
5/11/2014 11:12:55 PM

Haklısınız.. Teşekkür ederim ellerinize sağlık

hikmet okumuş makale yorum
Hikmet Okumuş
5/11/2014 11:13:36 PM

Rica ederim.

hikmet okumuş makale yorum
Caner Can
5/13/2014 7:16:25 AM

Hikmet bey bir sorum olacak;

Ben veri tabanı oluşturmuştum. Bu veri tabanında üniversite bölümleri ve enstitüler var. Yukarıdaki kod ile listbox'a sadece bölümleri çektim.

İstediğim şu ListBox içerisindeki bölüme tıkladığımda yine veri tabanın enstituler sütunundaki bilgiyi başka bir listbox'a yazdırmak...

Bunun için hangi kodu kullanmayım.

hikmet okumuş makale yorum
Hikmet Okumuş
5/13/2014 10:38:27 PM

Merhaba Caner Can,

Muhtemelen bire çok ilişki türünde bir kurgu oluşturmak istiyorsun. Şöyle;

Bölüm olarak "A Bölümü", Enstitü olarak ise "1. Enstitü", "2. Enstitü" ve "3. Enstitü" olsun. Bu ilişkiyi kurmuş olman gerekmekte. Detay tablosu içerisindeki her satırda ilgili üst satıra ait "Id" bilgisi yer almak zorundadır.

1. ListBox içerisine bölümleri çektin. Seçtiğin bölümün Id değeri ile Enstitü tablosuna select çekmen gerekmekte.

"Select * From Enstitü Where BolumId = 1"

Bu sorgunun sonucu sana seçtiğin bölümün Enstitü koleksiyonunu döndürecek. Dönen sonucu artık 2. ListBox içerisinde gösterebilirsin.

hikmet okumuş makale yorum
emin
4/2/2015 5:31:27 PM

çok teşekkürler bu değerli yazı için.

hikmet okumuş makale yorum
seda
5/3/2015 3:54:42 PM

merhaba ben bir kullanıcı giriş yaptırmaya çalışıyorum mssql de kodlarım bunlar aldıgım hata ise Cannot open database "db_kullanici" requested by the login. The login failed.
Login failed for user 'ultraaslan\Seda'. bunu nasıl çözebilirim ?

if (String.IsNullOrWhiteSpace(textBox1.Text) ||
String.IsNullOrWhiteSpace(textBox2.Text))
{
MessageBox.Show("Giriş Başarısız! Eksiksiz Giriniz!", "..:: HATA ::..",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}

baglanti.Open();
string sql = "SELECT * FROM tbl_kullanici WHERE KAdi=@KAdi AND KSifre=@KSifre";
SqlParameter prms1 = new SqlParameter("@KAdi", textBox1.Text);
SqlParameter prms2 = new SqlParameter("@KSifre", textBox2.Text);
SqlCommand cmd = new SqlCommand(sql, baglanti);
cmd.Parameters.Add(prms1);
cmd.Parameters.Add(prms2);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlDataReader dr = cmd.ExecuteReader();
da.Fill(dt);
baglanti.Close();

if (dt.Rows.Count > 0)
{
MessageBox.Show("Hoşgeldin");
}
else
{
MessageBox.Show("Veritabanında böyle bir kullanıcı bulunamadı");
}
}

hikmet okumuş makale yorum
Hikmet Okumuş
5/4/2015 10:07:20 PM

Merhaba Seda,

Almış olduğun hata kodunu Google' da aratırsan görsel sonuçlar bulabilirsin.

hikmet okumuş makale yorum
İsa
3/21/2017 1:54:53 PM

Merhaba,Sql sorgusu ile veritabanından çoklu veri alıp bunu session'a nasıl atayabilirim. Örnek kodum aşağıdaki gibidir.Yardımlarınızı rica ederim.
-------------------------------------------------------------------------------------------------
Sorgu sonucu gelen veri şöyle (17,19,26,39)

private void KullaniciYetkiCek()
{
OleDbConnection con = new OleDbConnection(baglanti);
con.Open();
OleDbCommand cmd = new OleDbCommand("Select KimleriGorsun from Yetkiler Where KullaniciId=(Select [KullaniciId] from [Kullanicilar] Where KullaniciAdi='" + Session["KullaniciAdi"].ToString() + "')", con);
OleDbDataReader dr = cmd.ExecuteReader();

//Buraya nasıl bir kod yazmalıyım ki. Çoklu gelen veriyi tek bir sesiona atayayım. Gelecek veri adeti değişebiliyor.

dr.Close();
con.Close();
}

hikmet okumuş makale yorum
Hikmet Okumuş
3/21/2017 4:01:37 PM

Merhaba İsa,

OleDbDataReader yerine OleDbDataAdapter kullanırsan istediğin gibi bir sonuç elde edebilirsin. Aşağıdaki makalede örnek bir kullanımı var.

http://www.hikmetokumus.com/makale/50/csharp-ile-sqldataadapter-kullanimi

da.Fill(dt); satırından sonra da Session["Data"] = dt; şeklinde verilerini session üzerinde tutabilirsin.

hikmet okumuş makale yorum
İsa
3/22/2017 10:51:46 AM

Hikmet bey, teşekkür ederim yardımızın için. Verileri sesionala taşıyabildim. Fakat datatable ile veriler tek bir sütün içerisinde ayrı satırlarda geliyor. Bu çoklu verileri string bir ifadeye aralarında virgül olarak nasıl atayabilirim. Aşağıdaki şekilde yapınca sadece ilk sıradaki veriyi stringe atayabiliyorum.

string yetkiler= dt.Rows[0]["KimleriGorsun"].ToString();

----------------------------------------------------------------------------
private void KullaniciYetkiCek()
{
OleDbConnection con = new OleDbConnection(baglanti);
con.Open();
OleDbCommand cmd = new OleDbCommand("Select KimleriGorsun from Yetkiler Where KullaniciId=(Select [KullaniciId] from [Kullanicilar] Where KullaniciAdi='" + Session["KullaniciAdi"].ToString() + "')", con);
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
Session["Data"] = dt;

da.Dispose();
con.Close();
}

hikmet okumuş makale yorum
Hikmet Okumuş
3/22/2017 12:07:26 PM

Merhaba İsa,

Aşağıdaki kod yardımcı olacaktır.

StringBuilder sb = new StringBuilder();

for (int i = 0; i < dt.Rows.Count; i++)
{
sb.Append(dt.Rows[0]["KimleriGorsun"].ToString());

if ((i + 1) < dt.Rows.Count)
sb.Append(", ");
}

string ifade = sb.ToString();



Yorum Ekle