Bu yazımızda C# ile Sql veritabanında bulunan ilişkili tabloları kullanarak bağlantı oluşturma ve bu tablolardan istenilen kayıtları çekme işlemini gerçekleştiren basit bir uygulama oluşturacağız. Örneğimizde veritabanımızda 3 adet tablo bulunmakta. Bu tablolardan birincisi Öğrenci bilgilerini, ikincisi Kitap bilgilerini ve üçüncüsü ise Hareket bilgilerini yani hangi öğrencinin hangi kitabı aldığı,ne zaman aldığı vb.. bilgileri tutuyor olacak. Formumuzda ise 2 adet datagridView kontrolü olacak. 1. DataGridView kontrolünde Öğrenciler listelenecek. Listelenen bu öğrencilerden hangisi seçiliyse dataGridView2 kontrolümüzde o öğrenciye ait hangi kitabı okuduğu bilgisinin görüntülenmesini sağlayacağız. Örneğimizi adım adım gerçekleştirelim.
İlk olarak dbKitaplik veritabanımızı oluşturalım ve Ogrenci,Kitap ve Hareket tablolarını aşağıdaki gibi oluşturalım.
Tablolarımızı oluşturduktan sonra deneme amaçlı kayıtlarımızı giriyoruz.
Tablolarımızı oluşturduktan sonra Form kısmına geçiyoruz. Örneğimizde sadece veri çekme işleminin nasıl yapıldığını göstereceğim için 2 adet dataGridView kontrolü yeterli olacaktır.
Şimdi 1. DataGridView içinde Öğrenci listesinin gelmesini sağlayalım. Bu işlemi Form Yüklendiğinde yani Form_Load olayında gerçekleştireceğiz.
Kodlarımızı oluşturmaya başlayalım. İlk olarak Sql bağlantıları için gerekli;
1 2 3 | using System.Data.SqlClient; |
satırını ekleyelim.
Daha sonra public olarak aşağıdaki nesnelerimizi oluşturalım.
1 2 3 4 5 | SqlConnection con= new SqlConnection("server=.; Initial Catalog=dbKitaplik;Integrated Security=SSPI"); SqlDataAdapter da; DataSet ds; |
Şimdi Ogrenci tablosundaki tüm öğrencilerin dataGridView içinde listelenmesini sağlayalım.
1 2 3 4 5 6 7 8 9 10 11 12 | private void Form1_Load(object sender, EventArgs e) { da = new SqlDataAdapter("Select *From Ogrenci", con); ds = new DataSet(); con.Open(); da.Fill(ds, "ogrenci"); con.Close(); dataGridView1.DataSource = ds.Tables["Ogrenci"]; dataGridView1.ReadOnly = true; } |
Bu kısım basit olan kısımdı. Daha önceki veritabanı örneklerimizde sıkça değişik şekillerde kullanmıştık. Şimdi asıl önemli olan kısma yani üstüne tıklanan öğrenciye ait bilgilerin diğer dataGridView‘ de görüntülenmesini sağlayalım. Bu işlemi gerçekleştirmek için dataGridView1_SelectionChanged olayını kullanacağız.
Seçilen öğrenciye ait Hareket tablosundaki kitap bilgilerini aşağıdaki gibi bir kod yazarak çekebiliriz.
1 2 3 4 5 6 7 8 9 10 11 | private void dataGridView1_SelectionChanged(object sender, EventArgs e) { int numara = (int)dataGridView1.CurrentRow.Cells[0].Value; ds = new DataSet(); da = new SqlDataAdapter("SELECT *FROM Hareket WHERE hogr=" + numara, con); da.Fill(ds, "Hareket"); dataGridView2.DataSource = ds.Tables["Hareket"]; con.Close(); } |
Fakat bu şekilde yaptığımızda bilgilerin tam olarak neye ait olduğu konusunda fikir sahibi olmanın zor olduğunu söyleyebiliriz.
Projemizi çalıştırdığımızda ekran çıktısı yukarıdaki gibi olacak ve çok anlaşılır olmayacaktır. Şimdi bunun yerine daha anlaşılır bir şekilde gösterimi sağlayacak sorgumuzu oluşturalım. Sorgumuzda INNER JOIN ve AS kullanımını göreceğiz.
1 2 3 4 5 6 7 8 9 10 11 12 13 | private void dataGridView1_SelectionChanged(object sender, EventArgs e) { int numara = (int)dataGridView1.CurrentRow.Cells[0].Value; ds = new DataSet(); da = new SqlDataAdapter("Select Ogrenci.ogrno AS NUMARA,ograd AS AD,ogrsoyad AS SOYAD,kitapad AS [KİTAP ADI],halis AS [ALIŞ TARİHİ],hteslim AS [TESLİMTARİHİ] FROM Ogrenci JOIN Hareket on Ogrenci.ogrno=Hareket.hogr JOIN Kitap on Kitap.ktpno=Hareket.hkitap WHERE Ogrenci.ogrno="+numara, con); con.Open(); da.Fill(ds, "Hareket"); dataGridView2.DataSource = ds.Tables["Hareket"]; con.Close(); } |
Kodlarımızı yukarıdaki şekilde değiştirdiğimizde ekran görüntüsü de aşağıdaki gibi değişecektir.
dataGridView1_SelectionChanged olayına yazdığımız kodları incelediğimizde seçili olan satırdaki öğrenci numarasını elde etmek için
1 2 3 | int numara = (int)dataGridView1.CurrentRow.Cells[0].Value; |
satırının kullanıldığını görüyoruz. Bu numara bizim için bu öğrenciye ait diğer tablolardaki verileri çekmek için gerekli bir veri. Sorgumuzda da bu öğrenciye ait diğer verilerin Kitap ve Hareket tablolarında çekilerek listelendiğini görebilirsiniz.
Daha sonraki yazılarımızda ilişkili tablolarda Kayıt ekleme , Kayıt Silme ve Kayıt Güncelleme işlemlerine ait örnekler oluşturacağız.
Kodlarımızın tamamlanmış hali;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; namespace kutuphane { public partial class Form1 : Form { SqlConnection con= new SqlConnection("server=.; Initial Catalog=dbKitaplik;Integrated Security=SSPI"); SqlDataAdapter da; DataSet ds; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { da = new SqlDataAdapter("Select *From Ogrenci", con); ds = new DataSet(); con.Open(); da.Fill(ds, "ogrenci"); con.Close(); dataGridView1.DataSource = ds.Tables["Ogrenci"]; dataGridView1.ReadOnly = true; } private void dataGridView1_SelectionChanged(object sender, EventArgs e) { int numara = (int)dataGridView1.CurrentRow.Cells[0].Value; ds = new DataSet(); //da = new SqlDataAdapter("SELECT *FROM Hareket WHERE hogr=" + numara, con); da = new SqlDataAdapter("Select Ogrenci.ogrno AS NUMARA,ograd AS AD,ogrsoyad AS SOYAD,kitapad AS [KİTAP ADI],halis AS [ALIŞ TARİHİ],hteslim AS [TESLİMTARİHİ] FROM Ogrenci JOIN Hareket on Ogrenci.ogrno=Hareket.hogr JOIN Kitap on Kitap.ktpno=Hareket.hkitap WHERE Ogrenci.ogrno="+numara, con); con.Open(); da.Fill(ds, "Hareket"); dataGridView2.DataSource = ds.Tables["Hareket"]; con.Close(); } } } |
Merhabalar ticari bir kaygı olmadan tamamen merak ile c# öğrenmeye başladım. bir akrabam muhtar ve köyde evlenenleri kaydedip nüfus müdürlüğüne gönderilmek döküm alması gereken bir form olacak. Sql de 3 tablo olacak, 1.tablo da bayana ait bilgiler, 2.tabloda erkeğe ait bilgiler ve 3. tabloda da evlenme cüzdan no, evlilik tarihi gibi her ikisine ait olan bilgilerin yer aldığı GenelBilgiler tablosu olacak. bu üç tabloyu tek bir datagrid de gösterme imkanı varmı?
Erkek icin ayri kadin icin ayri tabloya gerek yok bence. Bir tablo kisiler için ve bor tabloda evlilik için yeterli olur diye düşünüyorum. Evlenen kisilerin id si evlilik tablosuna yazilir. Join ile istediğin bilgiyi cekersin.
Ahmet bey merhaba konu ile ilgili olmayabilir ama bir sorum olacak size. Bir quiz maker yapmaya çalışıyorum.Veri tabanında 500 tane soru var. Comboboxa soru sayısı ekleyip örneğin 20,30,40 daha sonra comboboxtan soru sayısını seçip testi başlat dediğimizde comboboxta seçilen soru sayısı kadar rastgele soru nasıl çekebilirim.
Teşekkür ederiz Ahmet Bey. Çok sağolun, kolay gelsin.
Öncelikle çok teşekkür ederim ilginiz için. Aradığımız şey konusunda yardımcı oldunuz. Biz kodumuzu VB.net üstünden yazıyoruz. Aynı mantıkla uygulamaya çalıştık ancak bir türlü yol alamadık. Bu konuda bir fikriniz var mı diye danışmak istedim. Ellerinize sağlık.
Rica ederim. Vb.net ile ilgili maalesef yardımcı olamıyorum. Ama programınızın çalışmayan ya da hata oluşan bölümleri ile ilgili yine yardımcı olmaya çalışırım. Kolay gelsin.