ADO.NET Disconnected Mimari – SqlDataAdapter,DataSet Ve DataTable Nesneleri

Bu yazımda ADO.NET te Disconnected Mimarye giriş yapacağız.Disconnected mimaride veritabanıyla pek ilişkimiz yoktur.Connected mimaride olduğu gibi manuel olarak bağlantıyı açıp kapatmamıza gerek yoktur.SqlDataAdapter nesnesi bu işi otomatik olarak yapmaktadır.Şimdi nesneleri tanıtıp örnek yapalım.

SqlDataAdapter Nesnesi
SqlCommand nesnesi gibi verilen bağlantı üzerine sorguyu çalıştırır.Bağlantıyı açıp kapatmaya gerek yoktur.Kendisi bu işlemi otomatik yapar.Biz ona select sorgusu veririz, o bu select sorgusuna göre insert,update ve delete sorgularını otomatik olarak oluşturur.Daha sonra SqlDataAdapter metodlarını kullanarak bu sorguları çalıştırabiliriz.

DataSet Nesnesi 
Bellekte veritabanına benzer bir yapı oluşturur.Bu yapı içinde DataTable’lar saklayabiliriz.Default olarak içinde bir adet DataTable vardır.İçindeki DataTable’ler DataSet’in Tables koleksiyonunda saklanır.

DataTable Nesnesi 
Bellekte veritabanı tablosu yapısında bir yapı oluşturur.

Şimdi formumuza bir ComboBox kontrolü koyalım ve Northwind tablosundaki Ad ve Soyadları bu ComboBoxın içine çekelim.

 SqlConnection baglanti = new SqlConnection();
            baglanti.ConnectionString = "server=GENᅦAY-GENᅦAY;database=northwind;trusted_connection=true;";
            SqlDataAdapter dta = new SqlDataAdapter("select Adi + ' ' + Soyadi as isim from Personeller",baglanti);
            DataSet ds = new DataSet();
            dta.Fill(ds,"Personeller");
            comboBox1.DataSource=ds.Tables["Personeller"];
            comboBox1.DisplayMember = "isim";
            comboBox1.ValueMember = "PersonelId";

Yukardaki kodları çalıştırdığımız zaman ComboBox kontrolüne Ad ve Soyadın eklendiğini göreceğiz.Tabi “Gençay Yıldız” şeklinde eklenmesi için sorgumuzu ona göre ayarlıyoruz.Şimdi kodlardaki yapıları izah edeyim;
SqlDataAdapter dta = new SqlDataAdapter(“select Adi + ‘ ‘ + Soyadi as isim from Personeller”,baglanti); = SqlCommand gibi sorgumuzu yazıp , bağlantımızı tanımlıyoruz.Bağlantıyı kendisi otomatik açıp kapattığından biz bağlantıyı ellemiyoruz.
DataSet ds = new DataSet(); = DataSet nesnesi oluşturuyoruz ki DataAdapter nesnesinden DataSet’e tabloları atabilelim.
dta.Fill(ds,”Personeller”); = SqlDataAdapter’ın Fill() metoduyla DataSet’e tabloları atabiliriz.Gördüğünüz gibi referans adı ds olan DataSet nesnesine veritabanından gelen tablo atılıyor ve bu tablonun adınada “Personeller” deniyor.
comboBox1.DataSource=ds.Tables[“Personeller”]; = ComboBox,ListBox vs. gibi kontrollerin DataSource özelliği vardır.Bu özellik sayesinde bu kontrollerin veri kaynağı olarak neyi baz alacağını gösterebiliyoruz.Bu şekilde,ds.Tables[“Personeller”] diyerek, DataSet’in içindeki tablolardan adı Personeller olan tabloyu bu nesneye verikaynağı yap demiş oluyorum.Eğer SqlDataAdapter’ın Fill() metodunu kullanırken DataSet’e aktarılan tabloya “Personeller” ismini vermemiş olsaydım, bu sefer ds.Tables[0] olarak bu tabloyu çağıracaktım.Çünkü yazdığımız sorgu sonucunda bir tane tablo dönecektir ve o tablonun ismi olsada olmasada index numarası 0 dır.
comboBox1.DisplayMember = “isim”; = Burada ise Personeller tablosunda hangi kolonu göstereceğini söylüyoruz.Birden fazla kolon dönmesi sonucunda ComboBox türü nesneler hangilerini nasıl göstereceğini bilmediği için DisplayMember özelliği ile hangi kolonu göstermesi gerektiğini belirtiyoruz.
comboBox1.ValueMember = “PersonelId”; = Örneğin ben ComboBox’tan “Gençay Yıldız” ı seçiyorum ve bunun sonucunda bana bir değer dönmesini talep ediyorum.”Gençay Yıldız” isim ve soyisminin PersonelId sini bana ValueMember özelliği sayesinde geliyor.

Eğer ComboBox,listBox vs. gibi kontrolleri kullanıyorsanız SelectedIndexChanged yerine SelectionChangeCommitted olayını kullanınız.Bunun sebebi SelectedIndexChanged yüklenir yüklenmez çalışırken SelectionChangeCommitted siz tıkladığınız zaman çalışacaktır.Bu aksaklık bazen istenmeyen ufak tefek sorunlara yol açabilir.

Şimdi DataTable nesnesini de kullanmayı görelim.

SqlConnection baglanti = new SqlConnection();
            baglanti.ConnectionString = "server=GENÇAY-GENÇAY;database=northwind;trusted_connection=true;";
            SqlDataAdapter dta = new SqlDataAdapter("select Adi + ' ' + Soyadi as isim,PersonelId from Personeller",baglanti);
            DataSet ds = new DataSet();
            DataTable dt = new DataTable("Personeller");
            ds.Tables.Add(dt);
            dta.Fill(ds,"Personeller");
            comboBox1.DataSource = dt;
            comboBox1.DisplayMember = "isim";
            comboBox1.ValueMember = "PersonelId";

Yukardaki yapıda ise,DataTable nesnesi oluşturup adına “Personeller” dedim.Bunu referans adı ds olan DataSet nesnesinin Tables koleksiyonuna(koleksiyon olduğu için Add metodu var) Add() metoduna ekliyorum.SqlDataAdapter nesnesinin Fill() metoduyla DataSet’ime tabloyu yüklerken bu sefer DataSet’imdeki var olan “Personeller” tablosunu seçiyorum.ComboBox’ın DataSource özelliğine DataSet’imi değil DataTable’ımı bağlıyorum.Sonuçta diğer türlü DataSet’in içindeki tabloyu göstererek bağlıyordum.Bişey değişmiyor.Geri kalanı bildiğiniz gibi..

Hiç DataSet oluşturmadan SqlDataAdapter’a gelen verileri DataTable’a atabilirmiyiz diye sorarsanız eğer evet.SqlDataAdapter nesnesinin Fill() metoduna bu sefer DataSet değil DataTable nesnemizi yazarsak tablomuz DataTable’ımıza yüklenecektir.Mantıken bunu yaparken sorgumuzdan bir tablo geldiğini bilmemiz gerekiyor.Birden fazla tablo gelirse eğer bu tabloları DataTable ımıza değil,DataSet’imize atmalıyız.

SqlConnection baglanti = new SqlConnection();
            baglanti.ConnectionString = "server=GENÇAY-GENÇAY;database=northwind;trusted_connection=true;";
            SqlDataAdapter dta = new SqlDataAdapter("select Adi + ' ' + Soyadi as isim,PersonelId from Personeller",baglanti);
            DataTable dt = new DataTable();
            dta.Fill(dt);
            comboBox1.DataSource = dt;
            comboBox1.DisplayMember = "isim";
            comboBox1.ValueMember = "PersonelId";

Şimdilik burda keselim.Bir sonraki yazımda SqlDataAdapter nesnesini daha detaylı anlatacağım.İyi çalışmalar.

Bunlar da hoşunuza gidebilir...

6 Cevaplar

  1. Adil dedi ki:

    Çox sadə və çox gözəl başa salmısınız. Təşəkkürlər.

  2. Cem dedi ki:

    Selam Aleyküm,

    Yardıma ihtiyacım var..

    Ellerinize kalbinize sağlık zaman harcamışsınız bize bilgi sağlamışsınız ama ben internet bu bilgi ile kaynamasına rağmen çözüm bulamadım.

    ne ettiysem ne yaptıysam cevap 1 döndü. Toplam 6 adet oda sayısı olmasına rağmen. Sürekli 1 dönüyor.

    public void OdaMiktariniBul()
    {

    SqlConnection baglantim = new SqlConnection(@”Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\cemileca\Desktop\Otel Programim\Otel_Proje\Otel_Proje\Veriler\VerilerDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True”);

    baglantim.Open();

    SqlCommand komut = new SqlCommand(“SELECT COUNT (*) FROM Odalar”, baglantim);
    //string komutCumlesi = “SELECT COUNT (*) FROM Kullanicilar “; // Kaç adet odamızın bulunduğunu tespit ediyoruz
    i = komut.ExecuteScalar().ToString();

    VeriTabaniBaglantiyiKes();

    MessageBox.Show(i);

    }

    • Gençay dedi ki:

      Sevgili Kardeşim,

      SqlCommand nesnesinin constructorında sorguyu parametrik olarak verdiğin halde “komutCumlesi” değişkeninde göstermeye çalıştığın noktayı anlayamadım. Bilakis ilgili değişken içerisinde dikkat edersen eğer Kullanicilar tablosu üzerinde bir çalışma gerçekleştirilmektedir.

      Herşey bir yana eğer ki Odalar tablosunda 6 adet veri mevcutsa “komut” nesnesine execute çektiğin vakit 6 sonucunu geriye döndürmesi gerekmektedir. Eğer beklenen sonuçla karşılaşılmıyorsa hesaplamanda bir hata var demektir.

      Sevgiler…

  3. Mirelekber dedi ki:

    tesekkur edirem bu yaziya gore.cox gozel metodikaniz var.
    Bakiya ne vaxtsa gelsez sizinle gorusmek isterdim. aglinizda qalsa xeber edersiz +994703550608

    • Gençay dedi ki:

      Merhaba,

      Tam anlamadım ama teşekkür ederim 🙂

      Her daim telefondan ya da birebir görüşme ayarlayabiliriz.
      İyi günler dilerim…

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.