none
SQL 2 Tablo Veri bağlayıp çekmek RRS feed

  • Soru

  • Merhaba;

    SQL  de 2 adet tablom bulunmakta tabloların içeriği aşağıdaki gibi.

    Area:
    Block 1
    Block 2

    Regions:
    Area:Block 1-Block2
    SubArea:Hrgs1-Hrgs2

    2 adet dropdown bulunmakta dropdown 1de Area daki tablodaki bilgiler geliyor(Block1 - Block2). Block 1 seçtiğim zaman Regions'ta bulunan Block1'e baglı olan Subarea'ları listelemek istiyorum.

    Kendim şu kodu yaptım ama malesef hata alıyorum.

     protected void drpArea_SelectedIndexChanged(object sender, EventArgs e)
        {
    
            TextBox1.Text = drpArea.SelectedItem.Text;
            DataTable dtSubArea = system.GetDataTable("Select * from Regions where SubArea='" + drpArea.SelectedItem.Text + "' order by Sira'");
    
            drpArea.Items.Add("Seçiniz");
            drpArea.Items[0].Value = "0";
    
            int sira = 1;
            for (int i = 0; i < dtSubArea.Rows.Count; i++)
            {
                DataRow drSubArea = dtSubArea.Rows[i];
                drpArea.Items.Add(drSubArea["SubArea"].ToString());
                drpArea.Items[sira].Value = drSubArea["RegionsId"].ToString();
                sira++;
            }

    Konu hakkında desteğinizi bekliyorum.İlginiz için teşekkürler.


    • Düzenleyen Blach35 24 Nisan 2014 Perşembe 13:35
    24 Nisan 2014 Perşembe 13:32

Yanıtlar

  • Pekala.

    Zor yol:

    var secilenIl = "Izmir";
    
    
    var sql = @"select t3.* from Iller t1
    inner join ilIlce t2 on t1.ILId = t2.ILId
    inner join Ilceler t3 on t2.IlceId = t3.ilceId
      where t1.IlAdi = @secilen";
    
    DataTable tbl = new DataTable();
    using(SqlConnection con = new SqlConnection( ... ))
    {
      SqlCommand cmd = new SqlCommand(sql, con);
      cmd.Parameters.AddWithValue("@secilen", secilenIl);
      
      con.Open();
      tbl.Load( cmd.ExecuteReader());
      con.Close();
    }
    
    // ilceleri doldur
    ddList.DataSource = (from ... ).ToList();

    Kolay yol (projene Linq eklersen):

    var secilenIl = "Izmir";
    
    
    var ilceler = from ilce in db.Ilceler
                  where ilce.Il = secilenIl
                  select ilce;
    
    // dropdown doldur
    ddIlceler.DataSource = ilceler.ToList();

    Not: Il - Ilce ornegi aslinda 1-cok ama araya tablo koyarak sanki cok-cok iliskili imis gibi anlatmissiniz, ben de ona gore cevap yazdim.
    • Düzenleyen CetinBasoz 24 Nisan 2014 Perşembe 14:25
    • Yanıt Olarak İşaretleyen Blach35 26 Nisan 2014 Cumartesi 23:03
    24 Nisan 2014 Perşembe 14:24
  • Merhabalar;

    Bence de Çetin Bey'in dediği gibi eğer sadece il ilçe seçtirmek için bunu yapıyorsanız iki tablo yeterlidir.

    Iller ve İlçeler olmak üzere iki tane

    NOT: Sizin kullanmak istediğiniz yapıda 1 il'e ait birden fazla ilçe olabiliyor ve bir ilçeye ait birden fazla il olabiliyor. eğer bu şekilde kullanmayacaksanız

    Iller

    1. IlId
    2. Ad

    Ilceler

    1. IlceId
    2. IlId
    3. Ad

    Şeklinde oluşturursanız yeterli olacaktır.

    Sorgulama yaparken Il DropDownList'ının SelectedIndexChanced olayına

    SELECT * FROM Ilceler WHERE IlId=cbIller.SelectedValue.ToString()  şeklinde sql sorgusu kullanarak çekebilirsiniz.

    Daha sonra ilçeler DroDownList ini gelen sonuç ile doldurursun.

    NOT: Tabi ki parametre kullanarak yapınız.

    NOT: Iller dropdownlist'in AutoPostBack değerini True olarak ayarlayınız.

    Kolay Gelsin.


    Yunus Emre ALTINAY



    25 Nisan 2014 Cuma 10:20
  • Merhaba;

    O sorunu

    protected void drpArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            drpSubArea.Items.Clear();
            DataTable dtYetki = system.GetDataTable("Select * from Regions Where AreaId=" + drpArea.SelectedValue);
    
            drpSubArea.Items.Add("Select");
            drpSubArea.Items[0].Value = "0";
    
            int sira = 1;
            for (int i = 0; i < dtYetki.Rows.Count; i++)
            {
                DataRow drArea = dtYetki.Rows[i];
                drpSubArea.Items.Add(drArea["SubArea"].ToString());
                drpSubArea.Items[sira].Value = drArea["RegionsId"].ToString();
                sira++;
            }
    
            
        }

    Bu methotun ilk satırına yukarda kalın yazılı kodu eklersen düzelecektir.

    drpSubArea.Items.Clear(); Bu SubArea içerisindeki tüm değerleri siliyor.

    Text'ide

    drpSubArea.SelectedItem.Text; şeklinde alabilirsin.

    NOT: Ama Son tablonun Regions tablosunu neden kullandığınızı pek anlamadım.

    Kolay Gelsin.


    Yunus Emre ALTINAY


    • Düzenleyen Yunus Emre ALTINAY 26 Nisan 2014 Cumartesi 17:21
    • Yanıt Olarak İşaretleyen Blach35 26 Nisan 2014 Cumartesi 23:02
    26 Nisan 2014 Cumartesi 17:10
  • Merhaba;

    O zaman şu şekilde anlatayım

    Tablo tasarımını bu şekilde değiştiriniz SubArea ya sadece AreaId kolonu eklendi.

    Kayıtlar ise

    Şeklinde tablolara kayıt giriliyor örnekte olduğu gibi

    Area tablosunda Block 3 'ün id değeri 6 ve SubArea tablosundaki kaydında AreaId değeri 6.

    Yani Block 3 kaydının alt kayıtları SubArea tablosunda ki AreaId değeri 6 olan kayıtlar.

    Kod aşağıda

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                drpArea.DataSource = system.GetDataTable("SELECT * FROM Area");
                drpArea.DataTextField = "AreaName";  //Görünecek değer
                drpArea.DataValueField = "AreaId";	 //Arkaplan da tutulacak değer
                drpArea.DataBind();
                drpArea_SelectedIndexChanged(sender, e);  //BUNUN AMACI SAYFA İLK YÜKLENDİĞİNDE İLK KAYDA AİT BİLGİLERİN ALT KATEGORİLERİNİ YÜKLEMEK İÇİN 1 KEZ ÇALIŞTIRIYORUZ. 
            }
        }
        protected void drpArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            drpSubArea.Items.Clear();
            drpSubArea.DataSource = system.GetDataTable("SELECT * FROM SubArea WHERE AreaId=" + drpArea.SelectedItem.Value);
            drpSubArea.DataTextField = "SubAreaName";
            drpSubArea.DataValueField = "SubAreaId";
            drpSubArea.DataBind();
        }

    Şeklinde kullanırsan sanırım istediğini elde edeceksindir.

    NOT: İlk resimde SunAreaName yazmışım yanlışlıkla o SubAreaName olacak kafan karışmasın

    NOT: Bir de birşey gözüme takıldı sen DataTable'dan bilgi çekerken DataRow'a atayıp ondan sonra okuyorsun onu o şekilde değilde

    for(int i = 0;i < dtYetki.Rows.Count; i++)
    {
         dtYetki.Rows[i]["SubArea"].ToString(); //i' nci satırın SubArea kolonundaki bilgi
    }

    bu şekilde de kullanabilirsin. Kolaylık olsun diye yazdım.

    Kolay Gelsin.


    Yunus Emre ALTINAY





    27 Nisan 2014 Pazar 01:38

Tüm Yanıtlar

  • Afedersin ama sanirim tablo yapin hic anlasilmiyor. Gercek vewrinden bir bolumu, kod olarak verebilir misin (data yaratmakla ugrasmayalim). Ornegin:

    create table Area (areaID int , areaName varchar(100));
    
    insert into Area (areaId, areaName) values (1, "Area #1");
    

    24 Nisan 2014 Perşembe 13:36
  • Çetin Bey merhaba;

    Şu şekilde anlatırsam daha anlaşılır olucak. İl tablom - İlçe taplom ve ililce diye bir taplom daha var olarak düşünelim. il tablosuna izmir var. ilçe taplosunda konak var. ililcede izmir-konak şeklinde bunlar birleşmiş vaziyette.

    Yapmak istedigim. Dropdownlist1 de ili seçip dropdown2 de ilçeleri sıralamak. Ama ililçe de yazılı olan il'in ilçesini yazırmak. Kategori sistemi gibi ama bir turlu mantıgını oturtamadım. Anlatamama sebebimde bu yüzden. Kusura bakmayın.

    İlginiz için teşekkürler.

    24 Nisan 2014 Perşembe 14:02
  • Pekala.

    Zor yol:

    var secilenIl = "Izmir";
    
    
    var sql = @"select t3.* from Iller t1
    inner join ilIlce t2 on t1.ILId = t2.ILId
    inner join Ilceler t3 on t2.IlceId = t3.ilceId
      where t1.IlAdi = @secilen";
    
    DataTable tbl = new DataTable();
    using(SqlConnection con = new SqlConnection( ... ))
    {
      SqlCommand cmd = new SqlCommand(sql, con);
      cmd.Parameters.AddWithValue("@secilen", secilenIl);
      
      con.Open();
      tbl.Load( cmd.ExecuteReader());
      con.Close();
    }
    
    // ilceleri doldur
    ddList.DataSource = (from ... ).ToList();

    Kolay yol (projene Linq eklersen):

    var secilenIl = "Izmir";
    
    
    var ilceler = from ilce in db.Ilceler
                  where ilce.Il = secilenIl
                  select ilce;
    
    // dropdown doldur
    ddIlceler.DataSource = ilceler.ToList();

    Not: Il - Ilce ornegi aslinda 1-cok ama araya tablo koyarak sanki cok-cok iliskili imis gibi anlatmissiniz, ben de ona gore cevap yazdim.
    • Düzenleyen CetinBasoz 24 Nisan 2014 Perşembe 14:25
    • Yanıt Olarak İşaretleyen Blach35 26 Nisan 2014 Cumartesi 23:03
    24 Nisan 2014 Perşembe 14:24
  • Merhabalar;

    Bence de Çetin Bey'in dediği gibi eğer sadece il ilçe seçtirmek için bunu yapıyorsanız iki tablo yeterlidir.

    Iller ve İlçeler olmak üzere iki tane

    NOT: Sizin kullanmak istediğiniz yapıda 1 il'e ait birden fazla ilçe olabiliyor ve bir ilçeye ait birden fazla il olabiliyor. eğer bu şekilde kullanmayacaksanız

    Iller

    1. IlId
    2. Ad

    Ilceler

    1. IlceId
    2. IlId
    3. Ad

    Şeklinde oluşturursanız yeterli olacaktır.

    Sorgulama yaparken Il DropDownList'ının SelectedIndexChanced olayına

    SELECT * FROM Ilceler WHERE IlId=cbIller.SelectedValue.ToString()  şeklinde sql sorgusu kullanarak çekebilirsiniz.

    Daha sonra ilçeler DroDownList ini gelen sonuç ile doldurursun.

    NOT: Tabi ki parametre kullanarak yapınız.

    NOT: Iller dropdownlist'in AutoPostBack değerini True olarak ayarlayınız.

    Kolay Gelsin.


    Yunus Emre ALTINAY



    25 Nisan 2014 Cuma 10:20
  • Yunus Bey merhaba;

    Dediğiniz gibi sql biraz değiştirdim. Ama yapmak istedigimizi tam anlamı ile yapamadım. Konu hakkında desteğinizi bekliyorum.  Dropdown tıklanınca aşağıdaki kodları yazdım. Ama Bu sefer drop2 doldugunda devamlı altına ekleniyor.

      DataTable dtYetki = system.GetDataTable("Select * from Regions Where AreaId=" + drpArea.SelectedValue);
    
            drpSubArea.Items.Add("Select");
            drpSubArea.Items[0].Value = "0";
    
            int sira = 1;
            for (int i = 0; i < dtYetki.Rows.Count; i++)
            {
                DataRow drArea = dtYetki.Rows[i];
                drpSubArea.Items.Add(drArea["SubArea"].ToString());
                drpSubArea.Items[sira].Value = drArea["RegionsId"].ToString();
                sira++;
            }

    Dediklerim Tam anşaşılamadıgı için ss görüntülerini koyuyorum. Value değer olarak değilde text değerini direk alma ihtimalimiz ola bilirmi birde.

    Son olarak tüm sayfanın kodlarını veriyorum.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Data.Sql;
    using System.Data.SqlClient;
    
    public partial class Administrator_New_Work_Order : System.Web.UI.Page
    {
        Fonksiyon system = new Fonksiyon();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack == false)
            {
                AreaCek();
    
               
            }
            
           
        }
        void AreaCek()
        {
            DataTable dtYetki = system.GetDataTable("Select * from Area order by AreaName");
    
            drpArea.Items.Add("Select");
            drpArea.Items[0].Value = "0";
    
            int sira = 1;
            for (int i = 0; i < dtYetki.Rows.Count; i++)
            {
                DataRow drArea = dtYetki.Rows[i];
                drpArea.Items.Add(drArea["AreaName"].ToString());
                drpArea.Items[sira].Value = drArea["AreaId"].ToString();
                sira++;
            }
        }
    
        
        protected void Button1_Click(object sender, EventArgs e)
        {
    
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
    
        }
    
    
        protected void drpArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            DataTable dtYetki = system.GetDataTable("Select * from Regions Where AreaId=" + drpArea.SelectedValue);
    
            drpSubArea.Items.Add("Select");
            drpSubArea.Items[0].Value = "0";
    
            int sira = 1;
            for (int i = 0; i < dtYetki.Rows.Count; i++)
            {
                DataRow drArea = dtYetki.Rows[i];
                drpSubArea.Items.Add(drArea["SubArea"].ToString());
                drpSubArea.Items[sira].Value = drArea["RegionsId"].ToString();
                sira++;
            }
    
            
        }
        protected void drpSubArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            
        }
    }

    Desteğiniz için teşekkür edeirm.


    • Düzenleyen Blach35 26 Nisan 2014 Cumartesi 15:16
    26 Nisan 2014 Cumartesi 13:39
  • Merhaba;

    O sorunu

    protected void drpArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            drpSubArea.Items.Clear();
            DataTable dtYetki = system.GetDataTable("Select * from Regions Where AreaId=" + drpArea.SelectedValue);
    
            drpSubArea.Items.Add("Select");
            drpSubArea.Items[0].Value = "0";
    
            int sira = 1;
            for (int i = 0; i < dtYetki.Rows.Count; i++)
            {
                DataRow drArea = dtYetki.Rows[i];
                drpSubArea.Items.Add(drArea["SubArea"].ToString());
                drpSubArea.Items[sira].Value = drArea["RegionsId"].ToString();
                sira++;
            }
    
            
        }

    Bu methotun ilk satırına yukarda kalın yazılı kodu eklersen düzelecektir.

    drpSubArea.Items.Clear(); Bu SubArea içerisindeki tüm değerleri siliyor.

    Text'ide

    drpSubArea.SelectedItem.Text; şeklinde alabilirsin.

    NOT: Ama Son tablonun Regions tablosunu neden kullandığınızı pek anlamadım.

    Kolay Gelsin.


    Yunus Emre ALTINAY


    • Düzenleyen Yunus Emre ALTINAY 26 Nisan 2014 Cumartesi 17:21
    • Yanıt Olarak İşaretleyen Blach35 26 Nisan 2014 Cumartesi 23:02
    26 Nisan 2014 Cumartesi 17:10
  • Yunus Bey merhaba;

    Area tablosu ile SubArea tablosunu Regions tablosunda birleştiriyorum. Area'nın içinde bulunan alt kategoriler olarak. Mantıgımda bir hata var ise düzeltmek isterim. Amacım Dropdown1 de gosterilen Area namelere karsılık gelen Regions tablosundaki subarea'ları listelemek. Yani :

    DropDownlist1 de seçilen Block1 regions tablosundan Block1 olan SubArea ları listelemek. Bunu farklı bir yolda nasıl yapa bilirim? varsa bir örneğiniz öğrenmek isterim. Ayrıca value değerini text olarak değiştirgihimde hata alıyorum. Destekleriniz için teşekkür ederim.

    protected void drpArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            drpSubArea.Items.Clear();
            DataTable dtYetki = system.GetDataTable("Select * from Regions Where AreaId=" + drpArea.SelectedItem.Text);
    
            drpSubArea.Items.Add("Select");
            drpSubArea.Items[0].Value = "0";
    
            int sira = 1;
            for (int i = 0; i < dtYetki.Rows.Count; i++)
            {
                DataRow drArea = dtYetki.Rows[i];
                drpSubArea.Items.Add(drArea["SubArea"].ToString());
                drpSubArea.Items[sira].Value = drArea["RegionsId"].ToString();
                sira++;
            }
    
            
        }

    26 Nisan 2014 Cumartesi 23:00
  • Merhaba;

    O zaman şu şekilde anlatayım

    Tablo tasarımını bu şekilde değiştiriniz SubArea ya sadece AreaId kolonu eklendi.

    Kayıtlar ise

    Şeklinde tablolara kayıt giriliyor örnekte olduğu gibi

    Area tablosunda Block 3 'ün id değeri 6 ve SubArea tablosundaki kaydında AreaId değeri 6.

    Yani Block 3 kaydının alt kayıtları SubArea tablosunda ki AreaId değeri 6 olan kayıtlar.

    Kod aşağıda

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                drpArea.DataSource = system.GetDataTable("SELECT * FROM Area");
                drpArea.DataTextField = "AreaName";  //Görünecek değer
                drpArea.DataValueField = "AreaId";	 //Arkaplan da tutulacak değer
                drpArea.DataBind();
                drpArea_SelectedIndexChanged(sender, e);  //BUNUN AMACI SAYFA İLK YÜKLENDİĞİNDE İLK KAYDA AİT BİLGİLERİN ALT KATEGORİLERİNİ YÜKLEMEK İÇİN 1 KEZ ÇALIŞTIRIYORUZ. 
            }
        }
        protected void drpArea_SelectedIndexChanged(object sender, EventArgs e)
        {
            drpSubArea.Items.Clear();
            drpSubArea.DataSource = system.GetDataTable("SELECT * FROM SubArea WHERE AreaId=" + drpArea.SelectedItem.Value);
            drpSubArea.DataTextField = "SubAreaName";
            drpSubArea.DataValueField = "SubAreaId";
            drpSubArea.DataBind();
        }

    Şeklinde kullanırsan sanırım istediğini elde edeceksindir.

    NOT: İlk resimde SunAreaName yazmışım yanlışlıkla o SubAreaName olacak kafan karışmasın

    NOT: Bir de birşey gözüme takıldı sen DataTable'dan bilgi çekerken DataRow'a atayıp ondan sonra okuyorsun onu o şekilde değilde

    for(int i = 0;i < dtYetki.Rows.Count; i++)
    {
         dtYetki.Rows[i]["SubArea"].ToString(); //i' nci satırın SubArea kolonundaki bilgi
    }

    bu şekilde de kullanabilirsin. Kolaylık olsun diye yazdım.

    Kolay Gelsin.


    Yunus Emre ALTINAY





    27 Nisan 2014 Pazar 01:38
  • Yunus Bey merhaba;

    Desteğiniz için çok teşekkür ederim. Sorunu dediğiniz gibi tablo yapısını halledrek değiştirdim.

    İyi çalışmalar.

    28 Nisan 2014 Pazartesi 10:07