{"id":23422674,"url":"https://github.com/enescidem/form-db-system","last_synced_at":"2026-05-05T21:33:28.954Z","repository":{"id":266975856,"uuid":"899920753","full_name":"enescidem/Form-DB-System","owner":"enescidem","description":"A student management system on Microsoft SQL Server, managing data with basic SQL queries as well as advanced techniques like INNER JOIN, LEFT JOIN, Stored Procedures and Triggers.","archived":false,"fork":false,"pushed_at":"2024-12-22T07:55:05.000Z","size":159,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-09T10:28:58.020Z","etag":null,"topics":["csharp","database","database-management","mssql-database","sql","sqlserver"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/enescidem.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-07T11:34:39.000Z","updated_at":"2024-12-22T07:55:08.000Z","dependencies_parsed_at":"2024-12-07T12:36:07.949Z","dependency_job_id":null,"html_url":"https://github.com/enescidem/Form-DB-System","commit_stats":null,"previous_names":["enescidem/student-db-system","enescidem/form-db-system"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enescidem%2FForm-DB-System","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enescidem%2FForm-DB-System/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enescidem%2FForm-DB-System/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/enescidem%2FForm-DB-System/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/enescidem","download_url":"https://codeload.github.com/enescidem/Form-DB-System/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248019685,"owners_count":21034291,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","database","database-management","mssql-database","sql","sqlserver"],"created_at":"2024-12-23T03:09:26.954Z","updated_at":"2026-05-05T21:33:28.912Z","avatar_url":"https://github.com/enescidem.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Üniversite Öğrenci Paneli DB Projesi (Form)\n\n### Medium Links:\n\nEnglish: https://medium.com/@enescidem/university-student-panel-db-project-1aa18e218475\n\nTürkçe: https://medium.com/@enescidem/%C3%BCniversite-%C3%B6%C4%9Frenci-paneli-db-projesi-ebb7ca4a808f\n\n---\n\n**Proje Hakkında**  \nBu proje, üniversite öğrencilerinin ders seçimi, not görüntüleme, ayar yapma gibi ihtiyaçlarını karşılayan bir panel uygulamasıdır.\n\nMicrosoft SQL Server'da temel SQL sorguları ile INNER JOIN, LEFT JOIN, Saklı Prosedürler (Stored Procedures) ve Tetikleyiciler (Triggers) gibi ileri teknikleri kullanan bir öğrenci yönetim sistemi.\n\n## İçindekiler\n\n- [Projenin Amacı](#projenin-amacı)\n- [Teknolojiler](#teknolojiler)\n1. [ER Diyagram](#er-diyagram)  \n2. [Tablolar Arasındaki İlişkiler](#tablolar-arasındaki-ilişkiler)  \n3. [Öğrenci Girişi Formu](#öğrenci-girişi-formu)  \n   - [Giriş Ekranı SQL Sorgusu](#giriş-ekranı-sql-sorgusu)  \n   - [Giriş Yap Butonuna Bastığımızda](#giriş-yap-butonuna-bastığımızda)  \n4. [Şifremi Unuttum Butonuna Bastığımızda](#şifremi-unuttum-butonuna-bastığımızda)  \n5. [Şifremi Unuttum Sayfası Formu](#şifremi-unuttum-sayfası-formu)  \n   - [Şifremi Unuttum Ekranı SQL Sorgusu](#şifremi-unuttum-ekranı-sql-sorgusu)  \n6. [Giriş Yaptıktan Sonra Gelen Ekran](#giriş-yaptıktan-sonra-gelen-ekran)  \n   - [Öğrenci Sayfası Formu](#öğrenci-sayfası-formu)  \n     - [Sayfa Yüklenirken Çalışan SQL Sorgusu](#sayfa-yüklenirken-çalışan-sql-sorgusu)  \n7. [Notlar Sayfası Formu](#notlar-sayfası-formu)  \n   - [Sayfa Yüklenirken Çalışan SQL Sorgusu İle Tabloyu Doldurma](#sayfa-yüklenirken-çalışan-sql-sorgusu-ile-tabloyu-doldurma)  \n8. [Ayarlar Sayfası Formu](#ayarlar-sayfası-formu)  \n   - [Sayfa Yüklenirken Çalışan SQL Sorguları](#sayfa-yüklenirken-çalışan-sql-sorguları)  \n   - [Kaydet Butonuna Bastığımızda Çalışan SQL Sorguları](#kaydet-butonuna-bastığımızda-çalışan-sql-sorguları)  \n9. [Ders Seçimi Sayfası Formu](#ders-seçimi-sayfası-formu)  \n   - [Sayfa Yüklenirken Çalışan SQL Sorguları](#sayfa-yüklenirken-çalışan-sql-sorguları-1)  \n   - [Listele Fonksiyonu](#listele-fonksiyonu)  \n   - [Ders Ekle Butonuna Bastığımızda Çalışan SQL Sorguları](#ders-ekle-butonuna-bastığımızda-çalışan-sql-sorguları)  \n   - [Ders Sil Butonuna Bastığımızda Çalışan SQL Sorguları](#ders-sil-butonuna-bastığımızda-çalışan-sql-sorguları)  \n10. [Öğretmen İletişim Sayfası Formu](#öğretmen-iletişim-sayfası-formu)  \n    - [Sayfa Yüklenirken Çalışan SQL Sorguları](#sayfa-yüklenirken-çalışan-sql-sorguları-2)  \n    - [Öğretmen Arama](#öğretmen-arama)\n\n---\n\n## Projenin Amacı\nBu projede amaç, bir üniversite öğrencisi için kullanıcı dostu bir panel geliştirmektir. Proje, öğrencilerin:\n- Kendi bilgilerini görüntülemesini,\n- Ders seçimi yapmasını,\n- Notlarını takip etmesini,\n- Ayarlarını değiştirmesini ve güncellemesini,\n- İletişim için öğretmen bilgilerine erişmesini sağlamayı hedefler.\n\n---\n\n## Teknolojiler\nBu projede kullanılan teknolojiler ve araçlar:\n- **Programlama Dili:** C#\n- **Veritabanı:** Microsoft SQL Server\n- **Araçlar:** Visual Studio IDE\n- **Veritabanı İlişkileri:** INNER JOIN, LEFT JOIN, TRIGGER, STORED PROCEDURE (Saklı Yordam)\n- **UI:** Windows Forms\n  \n---\n\n## ER Diyagram\nProjede kullanılan tablolar ve ilişkiler, aşağıdaki ER diyagramında gösterilmiştir.\n\n![image](https://github.com/user-attachments/assets/a730c6b1-2c3c-4f35-a351-9d4780cf1c5c)  \n\n---\n\n## Tablolar Arasındaki İlişkiler\n![image](https://github.com/user-attachments/assets/97e7b4d4-5bb5-4a45-87cb-98e0f28e5aca)\nYanında anahtar işareti bulunan nitelikler PRİMARY KEY’dir. \nBurada okların ucundaki anahtar simgesine baktığımızda anahtar işaretinin gösterdiği nitelik herhangi bir\ntablonun PRİMARY KEY’ini okun diğer ucu ise o primary keyin diğer tabloda FOREIGN KEY olarak \nkullanıldığını göstermektedir.  \nÖrnek: Tblil tablosunun PRİMARY KEY’i olan ilID, TblOgrenci tablosunda yine ilID ismini alarak \nFOREIGN KEY olmuştur. \n\n![image](https://github.com/user-attachments/assets/561d0583-cd6a-4ea7-8bed-93c357abeca7)\nBurada tabloların tüm niteliklerini ve onların özelliklerini görmekteyiz. \nTblDers tablosunda: DersID niteliği otomatik artan bir özellik ekledim burada 100 den başlayarak 1’er \n1’er artarak ileriliyor. \nTblBolum tablosunda: BolumID niteliği otomatik artan bir özellik ekledim burada 300 den başlayarak 1’er \n1’er artarak ileriliyor. \nTblOgrenci tablosunda: OgrNo niteliği otomatik artan bir özellik ekledim burada 1000 den başlayarak \n1’er 1’er artarak ileriliyor. Ve Tel niteliği de default bir değer içeriyor eğer tabloya veri eklenirken Tel \nniteliği boş bırakılırsa Tel Yok yazdırmasını istiyoruz. Yine aynı şekilde AyarGuncellemeSayisi da default \nolarak 0 yaptım. \nTblNot tablosunda: VizeNotu ve FinalNotu nitelikleri de default olarak 0 atadım. \nTblOgretmen tablosunda: OgretmenID niteliği otomatik artan bir özellik ekledim burada 200 den \nbaşlayarak 1’er 1’er artarak ileriliyor. Ve yine aynı şekilde Tel niteliğine de default olarak Tel Yok değerini \natıyorum.\n\n---\n\n## Öğrenci Girişi Formu\n![image](https://github.com/user-attachments/assets/f760b673-8159-4fb6-bc85-704c9f714cf7)\n\n---\n\n### Giriş Ekranı SQL Sorgusu\n```csharp\npublic partial class OgrenciGirisi : Form\n    {\n        public static string _ogrencino, _sifre, _ogrenciad, _ogrsoyad, _tel, _ilID, _bolumID, _sinif, _ayarguncelleme;\n        private void buttonGiris_Click(object sender, EventArgs e)\n        {\n            //TEXTBOXA GİRİLEN DEĞERLERİ SELECT VERİTABANI SORGUSU İLE KONTROL ETME\n            _ogrencino = textBoxOgrenciNo.Text;\n            _sifre = textBoxSifre.Text;\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd = new SqlCommand();\n            con.Open();\n            cmd.Connection = con;\n            cmd.CommandText = \"SELECT * FROM TblOgrenci WHERE OgrNo='\" + _ogrencino + \"' AND Sifre LIKE'\" + _sifre + \"'\";\n            SqlDataReader read = cmd.ExecuteReader();\n            if (read.Read())\n            {\n                //TblOgrenci Tablosundaki verilere diğer classlardan erişebilmek için değişkenlere atama\n                SqlConnection con1 = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n                SqlCommand cmd1 = new SqlCommand();\n                con1.Open();\n                cmd1.Connection = con1;\n                cmd1.CommandText = \"SELECT * FROM TblOgrenci WHERE OgrNo='\" + _ogrencino + \"'\";\n                SqlDataReader read1 = cmd1.ExecuteReader();\n                read1.Read();\n                _ogrenciad = (string)read1[\"OgrenciAd\"];\n                _ogrsoyad = (string)read1[\"OgrSoyad\"];\n                _tel = (string)read1[\"Tel\"];\n                _ilID = Convert.ToString(read1[\"ilID\"]);\n                _bolumID = Convert.ToString(read1[\"BolumID\"]);\n                _sinif = Convert.ToString(read1[\"Sinif\"]);\n                _ayarguncelleme = Convert.ToString(read1[\"AyarGuncellemeSayisi\"]);\n                con1.Close();\n                \n                MessageBox.Show(\"Giriş Başarılı\");\n                this.Hide();\n                OgrenciSayfasi ogrenciSayfasi = new OgrenciSayfasi();\n                ogrenciSayfasi.Show();\n            }\n            else\n            {\n                MessageBox.Show(\"Hatalı öğrenci no veya şifre. Kontrol edip dekrar deneyiniz!\");\n            }\n            con.Close();\n        }\n```\n\n---\n\n### Giriş Yap Butonuna Bastığımızda\nBu kod bloklarında öncelikle  OgrenciGirisi formunda public static olarak tanımladığımız değişkenler var.Bu değişkenlere SQL’den veri çekicez. Bunları diğer formlardan ulaşabilmek için tutuyoruz. Textboxlardan aldığımız verileri değişkenlere atıyoruz.Sonra SELECT sorgusu ile TblOgrenci tablosundan OgrNo’su textBoxOgrenciNo’dan girilen değere eşit olan ve Sifre niteliğini de LIKE ile textBoxSifre’den gelen değere eşitleyip seçiyoruz. Sonra if sorgusu ile eğer bu sorgu read edilirse tabloda böyle bir kişi olduğunu anlıyoruz. Ve o kişinin verilerini çekebilmek için if içinde tekrar bir SELECT sorgusu ile gelen öğrencinin tüm değerlerini ilgili değişkenlere atıyoruz. Daha sonra OgrenciSayfasi’nı açıyoruz. Eğer böyle bir kullanıcı yoksa (else) hata mesajı çıkarıyoruz.\n\nÖrnek başarılı öğrenci girişi:\n![image](https://github.com/user-attachments/assets/c707e1f7-1584-4075-8c45-12786c588ac4)\n\nÖrnek başarısız öğrenci girişi:\n![image](https://github.com/user-attachments/assets/ffeafee4-4a74-4d55-b15b-b480f0902f40)\n\n---\n\n## Şifremi Unuttum Butonuna Bastığımızda\n```csharp\nprivate void buttonSifremiUnuttum_Click(object sender, EventArgs e)\n        {\n            SifremiUnuttumFormu sifremiUnuttumFormu = new SifremiUnuttumFormu();\n            sifremiUnuttumFormu.Show();\n        }\n```\nSifremiUnuttumFormu’nu çağırıyor.\n\n---\n\n## Şifremi Unuttum Sayfası Formu\n![image](https://github.com/user-attachments/assets/a6d5fd30-2a54-48e5-bfd8-c958c58c5dc9)\n\n### Şifremi Unuttum Ekranı SQL Sorgusu\n```csharp\n    public partial class SifremiUnuttumFormu : Form\n    {\n        private void buttonSifreyiDegistir_Click(object sender, EventArgs e)\n        {\n            int _ogrno = Convert.ToInt32(textBoxOgrNo.Text);\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd = new SqlCommand();\n            con.Open();\n            cmd.Connection = con;\n            cmd.CommandText = \"UPDATE TblOgrenci SET Sifre='\" + textBoxYeniSifre.Text +\"' WHERE OgrNo='\" + _ogrno + \"' AND OgrenciAd='\"+textBoxOgrAd.Text+\"' AND OgrSoyad='\"+textBoxOgrSoyad.Text+\"'\";\n            cmd.ExecuteNonQuery();\n            con.Close();\n            MessageBox.Show(\"Şifre Değiştirme Başarılı\");\n        }\n```\nBu kod bloğunda Şifreyi Değiştir butonuna bastığımızda UPDATE SQL sorgusu ile TblOgrenci tablosundaki Sifre niteliğini SET ediyoruz textBoxYeniSifre’den dönen değer ile ama WHERE koşulu true döndürürse. Yani OgrNo, OgrenciAd, OgrSoyad nitelikleri textboxlarda girilen değerler ile eşleşirse şifre değişikliği başarılı oluyor.\n\nVeritabanındaki veriler:\n ![image](https://github.com/user-attachments/assets/d6ee855f-7c6d-4594-abce-2851064eefda)\nCelal öğrencisinin şifresini değiştirelim:\n![image](https://github.com/user-attachments/assets/05e07882-8753-40e1-a5b0-0f30522042bb)\nŞifre değişikliğinden sonra veritabanındaki veriler:\n![image](https://github.com/user-attachments/assets/38c4f608-b67c-4df4-a4dd-0931a7128fa5)\n\n---\n\n## Giriş Yaptıktan Sonra Gelen Ekran\n\n### Öğrenci Sayfası Formu\n![image](https://github.com/user-attachments/assets/56565cd4-8b5b-46b0-b98d-baca05524322)\n\n---\n\n#### Sayfa Yüklenirken Çalışan SQL Sorgusu\n```csharp\n        private void OgrenciSayfasi_Load(object sender, EventArgs e)\n        {\n            labelHosgeldinOgrenci.Text = \"Hoşgeldin \"+OgrenciGirisi._ogrenciad+\" \"+ OgrenciGirisi._ogrsoyad;\n            labelSınıf.Text = \"Sınıfın: \"+OgrenciGirisi._sinif;\n            //SQL Sorgu ile Bölümünü bulma\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd = new SqlCommand();\n            con.Open();\n            cmd.Connection = con;\n            cmd.CommandText = \"SELECT BolumAd FROM TblBolum WHERE BolumID='\" + OgrenciGirisi._bolumID + \"'\";\n            SqlDataReader read = cmd.ExecuteReader();\n            read.Read();\n            labelBolum.Text = \"Bölümünüz: \" +Convert.ToString(read[\"BolumAd\"]);\n            con.Close();\n        }\n```\nBurada ilk olarak labelHosgeldinOgrenci ye OgrenciGirisi formundan tuttuğumuz değişkenleri atarak Hoşgeldin  Ad Soyad şeklinde çekiyoruz. Aynı şekilde sınıfı da çekiyoruz.  Burada önemli olan Bölümünüz kısmı çünkü bölüm kısmını TblOgrenci tablosunda BolumID olarak tuttuğumuz için. SELECT sorgusu ile TblBolum tablosundan BolumAd ı istiyoruz. WHERE koşulu ile de yine OgrenciGirisi sayfasında çektiğimiz BolumID leri eşit olan değeri döndürüyoruz. Dönen değeri de  labelBolum değerine atıyoruz. \nÖğrenci Sayfasında Notlar Butonuna tıkladığımızda:\nNotlarFormu’ndan nesne üretip notlar sayfasını gösteriyoruz.\n\n---\n\n## Notlar Sayfası Formu\n![image](https://github.com/user-attachments/assets/dc129bec-b5ad-4b6f-ba70-e5e596b88667)\n\n---\n\n### Sayfa Yüklenirken Çalışan SQL Sorgusu İle Tabloyu Doldurma\n```csharp \n    public partial class NotlarFormu : Form\n    {\n        DataTable tablo = new DataTable();\n        private void NotlarFormu_Load(object sender, EventArgs e)\n        {\n            //BURADA SQL SORGUSU İLE LEFT JOİNLE TABLO OLUŞTUURP TABLOYA AKTARMA\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            tablo.Clear();\n            SqlDataAdapter adtr = new SqlDataAdapter(\"SELECT TblNot.OgrNo, TblDers.DersAd, TblDers.DersKredi, TblNot.VizeNotu, TblNot.FinalNotu FROM TblNot INNER JOIN TblDers ON TblNot.DersID = TblDers.DersID WHERE OgrNo= '\" + OgrenciGirisi._ogrencino + \"' ORDER BY TblDers.DersAd\", con);\n            adtr.Fill(tablo);\n            dataGridViewNotlar.DataSource = tablo;\n            con.Close();\n        }\n```\nBurada ilk olarak DataTable türünde bir tablo oluşturuyorum. Daha sonra INNER JOIN ile Tabloları birleştirme işlemi yapıyorum. TblNot ile TblDers tablolarını join ediyorum. Bu tabloların DersID niteliğinin eşit olanları join ediyorum ve WHERE koşulu ile de hangi öğrenci giriş yaptıysa onun OgrNo’ su ile eşliyorum. ORDER BY ile de DersAd’a göre alfabetik(ASC) sıralıyorum.  ASC yazmadım çünkü default olarak ASC var zaten. En sonda bu dönen değerleri SELECT sorgusu ile çekip tabloya atıyorum.\n\n---\n\nÖğrenci Sayfasında AyarlarButonuna tıkladığımızda:\nAyarlarFormu’ndan nesne üretip notlar sayfasını gösteriyoruz.\n## Ayarlar Sayfası Formu\n![image](https://github.com/user-attachments/assets/1290b389-21da-4d01-a7bf-6df8a1f3b741)\n\n---\n\n### Sayfa Yüklenirken Çalışan SQL Sorguları\n```csharp\n    public partial class AyarlarFormu : Form\n    {\n        private void AyarlarFormu_Load(object sender, EventArgs e)\n        {\n            //TRİGGER İLE AYAR GUNCELLEMEYİ SÜREKLİ GÜNCELLİYORUZ\n            labelAyarGuncelleme.Text = \"Ayar Güncelleme Sayınız: \"+OgrenciGirisi._ayarguncelleme;\n            textBoxSifre.Text = OgrenciGirisi._sifre;\n            textBoxTelefon.Text = OgrenciGirisi._tel;\n            //ilID sını kullanarak SQL Sorgusu ile Şehiri Bulup comboboxa atma\n            SqlConnection con1 = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd1 = new SqlCommand();\n            con1.Open();\n            cmd1.Connection = con1;\n            cmd1.CommandText = \"SELECT ilAd FROM Tblil WHERE ilID='\" +OgrenciGirisi._ilID+ \"'\";\n            SqlDataReader read1 = cmd1.ExecuteReader();\n            read1.Read();\n            comboBoxSehir.Text= Convert.ToString(read1[\"ilAd\"]);\n            con1.Close();\n\n            //Veritabanındaki İlleri SAKLI YORDAM İLE ComboBoxa atma\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd = new SqlCommand();\n            con.Open();\n            cmd.Connection = con;\n            cmd.CommandText = \"EXEC SakliYordam\";\n            SqlDataReader read = cmd.ExecuteReader();\n            while (read.Read())\n            {\n                comboBoxSehir.Items.Add(read[\"ilAd\"]);\n            }\n            con.Close();\n        }\n```\nBurada öncelikle form sayfasında sağ üstte yazan Ayar Güncelleme Sayınız dan bahsedelim bu kısımda Trigger kullandım. Her TblOgrenci tablosu güncellendiğinde (UPDATE), TblOgrenci tablosundaki AyarGuncellemeSayisi niteliği 1 artıyor. Yazdığım Trigger:\n![image](https://github.com/user-attachments/assets/0390f7e2-de28-4734-a774-4739dd40db37)\nBuradaki trigger sorgusunda declare ile @id adında int bir değişken tanımlayıp. Ayar Güncelleme(UPDATE) işleminden sonra(AFTER)  o UPDATE sorgusundaki OgrNo’yu @id’ye tanımlıyoruz. Buradaki FROM inserted denilen yer UPDATE veya İNSERT işleminde oluşan görünmez bir tablo gibi düşünebiliriz. Ordan veriyi çekiyoruz. Daha sonra update ile TblOgrenci’de bulunan AyarGuncellemeSayisi niteliğini 1 arttıyoruz. Bunu da yaparken WHERE koşulu ile Ayar Güncelleme işleminde kullandığımız OgrNo yu yani @id’ye attığımız değeri OgrNo’ya eşit olsun koşulu koyuyoruz.\n\nAyarlar değiştirmeden önce Ayar Güncelleme Sayımız 12 idi. Ayarları güncelleyip tekrar bakalım:\n![image](https://github.com/user-attachments/assets/ee7801ff-ba90-4bbe-a736-e9296e483c62)\n![image](https://github.com/user-attachments/assets/521295c7-2113-4aab-9e4d-890a374a039b)\nGördüğümüz gibi 13 oldu.\n\nAyarlar formu açıldığında texboxlara ve combobaxa default olarak OgrenciGirisi sayfasında değişkenlerde tuttuğumuz değerleri yerleştirdim. Fakat bu kısımda şehir’i TblOgrenci’de ilID olarak tutuğumuz için bu ilID’nin hangi il olduğunu bulmak için yine bir sorgu yazıyoruz. Bu sorguda Tblil tablosundaki ilAd niteliğini seçiyoruz neye göre seçiyoruz WHERE koşuluyla ilID’si OgrenciGirisi formunda değişkene atadığımız _ilID olsun diyoruz. Ve daha sonra bunu comboBoxSehir’in textine atıyoruz. Böylelikle öğrencinin ili default olarak gelmiş oluyor. \n\nDaha sonra bu combobaxa diğer illeri atarak öğrencinin illeri değişmesine olanak sağlıyoruz. Combobaxa illeri atmak için SAKLI YORDAM kullandım. Yazdığım saklı yordam:\n![image](https://github.com/user-attachments/assets/1ede6730-c83a-4d65-b1e8-f555deb7aa13)\nSaklı yordamı kod ortamında EXEC SakliYordam ile çağırdım ve Tblil tablosundaki tüm nitelikleri seçerek. Tüm tabloyu döndürmüş oldum. Kodun devamında comboBoxSehir.Items.Add(read[\"ilAd\"]) ile ilAd niteliğindeki tüm verileri combobaxa atıyorum while döngüsü içinde.\n\ncomboBoxSehir'de ki şehirler:\n![image](https://github.com/user-attachments/assets/1c6060ba-24a4-40db-a446-2f7525ff8c58)\n\n---\n\n### Kaydet Butonuna Bastığımızda Çalışan SQL Sorguları\n```csharp\n        private void buttonKaydet_Click(object sender, EventArgs e)\n        {\n            //comboboxtan seçilen ilin Şehir ID'sini Bulma SQL Sorgusu\n            string _sehir = comboBoxSehir.Text;\n            SqlConnection con1 = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd1 = new SqlCommand();\n            con1.Open();\n            cmd1.Connection = con1;\n            cmd1.CommandText = \"SELECT ilID FROM Tblil WHERE ilAd='\"+ _sehir + \"'\";\n            SqlDataReader read1 = cmd1.ExecuteReader();\n            read1.Read();\n            int _ilID = (int)read1[\"ilID\"];\n            con1.Close();\n            \n            //Şehir ve Telefon Bilgisini Güncelleme SQL Sorgusu\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd = new SqlCommand();\n            con.Open();\n            cmd.Connection = con;\n            cmd.CommandText = \"UPDATE TblOgrenci SET Tel='\"+textBoxTelefon.Text+\"', ilID='\"+_ilID+\"', Sifre='\"+textBoxSifre.Text+\"' WHERE OgrNo='\"+Convert.ToInt32(OgrenciGirisi._ogrencino)+\"'\";\n            cmd.ExecuteNonQuery();\n            con.Close();\n            MessageBox.Show(\"Güncelleme Başarılı\");\n        }\n```\nİlk sorguda comboboxtan seçilen şehirin ilID'sini Bulmak için string türünde _sehir değişkeni tanımlıyoruz. Bu değişkene combobaxdan seçilen değeri atıyoruz. Daha sonra SELECT sorgusu ile ilID niteliğini seçip WHERE koşulu ile ilAd niteliğinin _sehir değişkenine eşit olan değeri döndürüyoruz.\n Alttaki sorguda ise textboxlara girilen değerleri ve combobaxda seçilen değerleri veritabanındaki veri tipleri ile aynı olucak şekilde veri tiplerine dönüştürerek TblOgrenci Tablosundaki Tel, ilID ve Sifre niteliklerini SET ediyoruz. WHERE koşulu ile de girisekranında aldığımız _ohrencino ile veritabanındaki OgrNo’ları eşleştiriyoruz.\n \nÖzlem Kişisi Üzerinden Bir Güncelleme İşlemi: \n\nDeğiştirmeden Önce:\n![image](https://github.com/user-attachments/assets/d826c34b-021c-4339-8820-f8e3785b6254)\n![image](https://github.com/user-attachments/assets/d9f554cd-223c-44bd-bfaf-72dacdca54bd)\n\nGüncellemeden Sonra:\n![image](https://github.com/user-attachments/assets/1c0a5909-d7d5-42e2-a21c-12301583d191)\n![image](https://github.com/user-attachments/assets/2a7efbcb-9df5-4b89-8336-0203daebd020)\nBurada yeniden TRİGGER’ında çalıştığını görmüş olduk.\n\n---\n\n## Ders Seçimi Sayfası Formu\n![image](https://github.com/user-attachments/assets/86cb177c-8d34-4335-9244-8a66acb34ad3)\n\n---\n\n### Sayfa Yüklenirken Çalışan SQL Sorguları\n```csharp\n    public partial class DersSecimiFormu : Form\n    { \n        private void DersSecimiFormu_Load(object sender, EventArgs e)\n        {\n            //ALMADIĞIN DERSLERİ İÇ İÇE SORGU İLE COMBOBOXA ATMA BURADA\n            SqlConnection con1 = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd1 = new SqlCommand();\n            con1.Open();\n            cmd1.Connection = con1;\n            cmd1.CommandText = \"SELECT DersAd FROM TblDers LEFT JOIN (SELECT * FROM TblNot WHERE OgrNo='\"+OgrenciGirisi._ogrencino+\"') AS TblNotOgrNo ON TblNotOgrNo.DersID=TblDers.DersID WHERE TblNotOgrNo.DersID IS NULL\";\n            SqlDataReader read1 = cmd1.ExecuteReader();\n            while (read1.Read())\n            {\n                comboBoxDersler.Items.Add(read1[\"DersAd\"]);\n            }\n            con1.Close();\n            Listele();\n        }\n```\nSayfa Yüklenirken Öğrencinin Almadığı Dersleri bulmak için bir sql sorgusu yazdım bu sorguda iç içe sorguları ve left join kullandım. İç sorgudan başlayalım TblNot tablosundaki tüm nitelikleri seç(SELECT) ama (WHERE)  OgrNo değeri girissayfasındaki _ogrno ile eşit olanları. Daha sonra burdan dönen tabloya TblNotOgrNo ismini verdim. Ve bu tablo ile TblDers tablosundaki DersAd niteliğini seçerek(SELECT) bu iki tabloyu DersID’lerine göre eşitleyip. WHERE koşulunda TblNotOgrNo ile isim verdiğim tablonun DersID niteliğininin NULL olduğu değerleri döndürerek Öğrencinin almadığı dersleri buldum ve bu dersleri  comboBoxDersler.Items.Add(read1[\"DersAd\"]); komutu ile while döngüsü içinde combobaxa attım.\n\nÖrnek olarak:\n\nTblDers tablosundaki dersler:\n![image](https://github.com/user-attachments/assets/1b382e61-0a19-43b6-8bae-8a7c56987875)\n![image](https://github.com/user-attachments/assets/990d038a-a552-449f-b9ed-3742e9d36541)\nGörüldüğü gibi yukarıdaki tablodaki dersler yok sadece almadığı dersler var.\n\nSayfa yüklenirken son olarak da Listele(); fonksiyonu ile tabloyu dolduruyorum .\n\n---\n\n### Listele() Fonksiyonu\n```csharp\n        //Aldığın Derslerin bilgilerinin gözüktüğü tabloyu sql sorgusu ile çağıran method\n        private void Listele()\n        {\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            tablo.Clear();\n            SqlDataAdapter adtr = new SqlDataAdapter(\"SELECT TblNot.OgrNo, TblDers.DersAd, TblDers.DersKredi, TblOgretmen.Ad, TblOgretmen.Soyad, TblOgretmen.Tel FROM TblNot, TblDers, TblOgretmen WHERE TblNot.OgrNo ='\" + OgrenciGirisi._ogrencino + \"'AND TblOgretmen.OgretmenID = TblDers.OgretmenID AND TblNot.DersID = TblDers.DersID\", con);\n            adtr.Fill(tablo);\n            dataGridViewDersler.DataSource = tablo;\n            con.Close();\n        }\n```\nBurada ilk olarak DataTable türünde bir tablo oluşturuyorum. Daha sonra SELECT sorgusu ile TblNot, TblDers, TblOgretmen tablolarındaki bazı nitelikleri(tablonun sütun isimlerini oluşturacak) çekerek WHERE koşulu ile OgrNo su giris sayfasındaki textboxa girilen oğrenci no olan VE TblOgretmen tablosundaki OgretmenID ile TblDers’de ki OgretmenID eşleştirerek VE TblNot tablosundaki DersID ile TblDers tablosundakini eşliyorum dönen tabloyu da aktarıyorum.\n\n---\n\n### Ders Ekle Butonuna Bastığımızda Çalışan SQL Sorguları\n```csharp\n        private void buttonDersEkle_Click(object sender, EventArgs e)\n        {\n            //comboboxtan seçilen dersin Ders ID'sini Bulma SQL Sorgusu\n            string _secilenders = comboBoxDersler.Text;\n            SqlConnection con1 = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd1 = new SqlCommand();\n            con1.Open();\n            cmd1.Connection = con1;\n            cmd1.CommandText = \"SELECT DersID FROM TblDers WHERE DersAd='\" + _secilenders+ \"'\";\n            SqlDataReader read1 = cmd1.ExecuteReader();\n            read1.Read();\n            int _dersID = (int)read1[\"DersID\"];\n            con1.Close();\n\n            //DERSİ ÖĞRENCİNİN DERSLERİNE DAHİL ETME\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd = new SqlCommand();\n            con.Open();\n            cmd.Connection = con;\n            cmd.CommandText = \"INSERT INTO TblNot(OgrNo, DersID) values('\"+int.Parse(OgrenciGirisi._ogrencino)+\"','\"+_dersID+\"')\";\n            cmd.ExecuteNonQuery();\n            con.Close();\n            Listele();\n            MessageBox.Show(\"Güncelleme Başarılı\");\n        }\n```\nİlk sorgu comboboxtan seçilen ilin Şehir ID'sini Bulma SQL Sorgusu ile aynı işlevi görmektedir. Tekrar açıklayarak kalabalık etmek istemedim. \n\nSon sorguya gelicek olursak ekleme (INSERT) sorgusu görüyoruz. TblNot Tablosuna ekleme yapıyoruz OgrNo niteliğine int.Parse(OgrenciGirisi._ogrencino) Ogrenci giris sayfasından tuttuğumuz değişkeni   doğru veri tipine dönüştürüyoruz ve DersID niteliğine üst sorgudan gelen _dersID değişkenini value olarak gösteriyoruz. En sonda Listele fonksiyonunu çağırarak tabloyu güncelliyoruz.\n\nÖrnek bir ekleme işlemi:\n![image](https://github.com/user-attachments/assets/c9c680a7-dd18-49c4-8731-024da3977826)\n\n---\n\n### Ders Sil Butonuna Bastığımızda Çalışan SQL Sorguları\n```csharp\n        private void buttonSil_Click(object sender, EventArgs e)\n        { \n            //Tablodan seçilen dersin Ders ID'sini Bulma SQL Sorgusu\n            string _secilenders = dataGridViewDersler.CurrentRow.Cells[1].Value.ToString();//GridViewdan dersin adını çekme\n            SqlConnection con1 = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd1 = new SqlCommand();\n            con1.Open();\n            cmd1.Connection = con1;\n            cmd1.CommandText = \"SELECT DersID FROM TblDers WHERE DersAd='\" + _secilenders + \"'\";\n            SqlDataReader read1 = cmd1.ExecuteReader();\n            read1.Read();\n            int _dersID = (int)read1[\"DersID\"];\n            con1.Close();\n\n            //silme işlemi\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            SqlCommand cmd = new SqlCommand();\n            con.Open();\n            cmd.Connection = con;\n            cmd.CommandText = \"DELETE FROM TblNot WHERE OgrNo='\"+ dataGridViewDersler.CurrentRow.Cells[0].Value.ToString()+\"' AND DersID='\"+_dersID+\"'\";\n            cmd.ExecuteNonQuery();\n            con.Close();\n            Listele();\n            MessageBox.Show(\"Silme Başarılı\");\n        }\n```\nÜstteki sorguda yine bi önceki comboboxtan seçilen dersin Ders ID'sini Bulma SQL Sorgusu ile aynı tek farkı combobax yerine tablodan seçilmesidir. Aynı şekilde açıklamıyorum.\n\nAlttaki sorgu ise DELETE sorgusudur. TblNot tablosunda silme işlemi yapıyoruz WHERE koşulu önemli burda çümlü o olmasa tüm tabloyu silerdi. Burada TblNot tablosundaki OgrNo niteliğini dataGridViewDersler’den seçilen satırın öğrenci nosunu(0. Index yani) alıyoruz VE DersID niteliğinin üst sorgudan dönen _dersID değişkenine eşit olan dersi siliyoruz.\n\nÖrnek Silme İşlemi Görsel Programlama Dersini seçtim ve Sildim:\n![image](https://github.com/user-attachments/assets/beeb11ff-f716-49d9-958a-f0e7535b2b7f)\n![image](https://github.com/user-attachments/assets/53621e19-26fb-4f1a-a89e-de93ad777e72)\n\n---\n\n## Öğretmen İletişim Sayfası Formu\n![image](https://github.com/user-attachments/assets/5406bbfb-3c01-4a0d-9d4f-da823c3b28ac)\n\nSQL’de ki datalar:\n![image](https://github.com/user-attachments/assets/51c9809f-2b5e-4ec2-9d00-c973c9f3557a)\n\n---\n\n### Sayfa Yüklenirken Çalışan SQL Sorguları\n```csharp\n    public partial class OgretmenIletisimFormu : Form\n    {\n        DataTable tablo = new DataTable();\n        private void OgretmenIletisimFormu_Load(object sender, EventArgs e)\n        {\n            //BURADA WİEW KULLANIMI VARDIR OgretmenListesi\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            tablo.Clear();\n            SqlDataAdapter adtr = new SqlDataAdapter(\"SELECT * FROM OgretmenListesi\", con);\n            adtr.Fill(tablo);\n            dataGridViewOgretmen.DataSource = tablo;\n            con.Close();\n        }\n```\nBu kod bloğunda VİEW kullandım. Yazdığım View:\n![image](https://github.com/user-attachments/assets/3d105bef-0005-4382-be11-d370fe618c5e)\nBurada SELECT ile TblOgretmen tablosundaki tüm nitelikleri seçip OgretmenListesi VIEW’ına aktarıyor.\n\nKod Bloğunda da SELECT ile OgretmenListesi VIEW’ını çağırarak tabloya aktarıyorz.\n\n---\n\n### Öğretmen Arama  \n```csharp\n      private void textBoxOgrenciNo_TextChanged(object sender, EventArgs e)\n        {\n            //WİEW KULLANARAK TEXTBOXTAKİ VERİYE GÖRE TABLOYU DEĞİŞTİRME\n            SqlConnection con = new SqlConnection(@\"Data Source=Enes;Initial Catalog=UniDB;Integrated Security=True\");\n            tablo.Clear();\n            SqlDataAdapter adtr = new SqlDataAdapter(\"SELECT * FROM OgretmenListesi WHERE Ad LIKE '\" + textBoxAra.Text+\"%'\", con);\n            adtr.Fill(tablo);\n            dataGridViewOgretmen.DataSource = tablo;\n            con.Close();\n        }\n```\nBu sorguda yukardaki sorgu ile aynı şekilde tek farkı WHERE koşulu bu koşul ile Ad niteliği LIKE ile textBoxAra’dan dönen değer ile % nin birleşmesi ile gelen değere göre tabloyu yeniden yüklüyor.Mesela textBoxAra ya a yazdık %’nin yanına gelmesiyle a% oluyor ve Ad niteliğinde a ile başlayan tüm öğretmenleri tabloya geri yüklüyor.\n\nÖrnek:\n![image](https://github.com/user-attachments/assets/54ef85b4-51cf-4a0d-affa-cef8f32aaaea)\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenescidem%2Fform-db-system","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fenescidem%2Fform-db-system","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fenescidem%2Fform-db-system/lists"}