Merhaba Arkadaşlar,
ADO.NET anlatımlarımıza Northwind veritabanı ile devam edeceğiz. Northwind Indır
Amacımız Northwind veritabanı kullanarak temel ADO.NET işlemlerini gerçekleştirebileceğimiz ortam yaratmak.
Basit örneklerle başlayıp, daha sonra kendi veritabanlarımızı oluşturarak daha zor örneklere devam edeceğiz.
ADO.NET konularını işlerken yapacağımız en zor işlem olan Visual Studio ortamında yeni bir proje açarak başlıyoruz 🙂
Amaç; Norhwind veritabanında bulunan kategorileri bir combobox içerisine doldurarak seçim yapacağız ve bu seçimin sonunda o kategoriye ait ürün sayısını ekrana yazdıran işlemler yapacağız.
Amacımızı belirleyip işlem sıramızı çizdikten sonra formumuzu tasarlamaya başlayabiliriz.
Objelerimiz: 1 buton 1 combobox ve 2 tane label ile ufak bir form tasarladık ve artık veritabanı ile konuşabilecek kodlarımızı yazalım.
SQL bağlantımı farklı eventler içerisinde kullanacağım için class seviyesinde tanımlıyorum.
Formum ilk yüklendiğinde herhangi bir kategori seçilmediği için tüm ürünlerin toplam sayısını ekrana yazdıralım. Bunun için form load event'inde gidip gerekli SQL sorgumu yazmam gerekiyor. Fakat burda SqlCommand sınıfını kullırken dikkat etmemiz gereken yer, bir önceki yazımızda da bahsettiğimiz gibi bizden SQL sorgusu ve Connection bilgisi istiyor.
Dediğimiz gibi SqlCommand nesnesinin ihtiyaç duyduğu Sql sorgusunu ve Connection bilgisini verdikten sonra yapmamız gereken en önemli olay veritabanı ile konuşabilmek için açık bir bağlantı bilgisine ihtiyaç duymaktayız!
Bu yüzden SqlCommand nesnemi Execute etmeden önce bağlantı nesnemi açtım. cnn.Open();
Artık SqlCommand nesnemi çalıştırabilir durumdayım ve geriye tek bir değer döndüreceğim için cmd.ExecuteScalar(); methodunu kullanıyorum. Buraya dikkat edilmesi gerekiyor arkadaşlar atlanıp unutulabiliyor.
HATIRLATMA
1-) ExecuteReader() : Eğer sorgunuz geriye tablo döndürüyorsa (SELECT * FROM Customers)
2-) ExecuteNonQuery() : Eğer sorgunuz INSERT, UPDATE, DELETE işlemleri içeriyorsa.
3-) ExecuteScalar() : Eğer sorgunuz geriye tek bir değer döndürüyorsa (SELECT COUNT(*) FROM Products)
ExecuteScalar() geriye object tipi döndürdüğü için casting işlemi yaparak integer bir değer elde ediyorum. int productCount = (int)cmd.ExecuteScalar();
Geriye sadece label üzerinde göstermemiz kaldı. lblProductCount.Text = productCount.ToString();
Sql Connection ile işiniz bittiği zaman bellek ve kaynak yönetimi açısından MUTLAKA Connection nesnenizi KAPATIN! cnn.Close();
Şimdi sıra geldi combobox nesneminizin içini kategori datası ile doldurmaya.
Get Categories butonumun click event'ini açıyorum ve..
Dikkat Edilmesi Gerekenler!
SqlDataReader bağlantılı modelin en güçlü bileşenidir ve veri okumaya yarar. Veri okuma yöntemini foreach döngüsünün çalışma mantığına benzer bir şekilde ilk kayıttan son kayda kadar read-only ve forward-only şekilde yapar.
Birinci kayıttan başlar kayıt bitene kadar devam eder. Kayıt okuma işleminin devam ettiğini ancak ve ancak bir döngü ile anlayabilirsiniz. Bu döngü ile "while" döngüsüdür. dr.Read() Dikkat! geriye bool bir değer döndürür yani bu şu anlama gelir.
Okuyabildiğin kadar dön!
- cmd.ExecuteReader(); methodu'nun geri dönüş tipi SqlDataReader
- Categories sınıfı oluşturup List şeklinde kullandık. List<Categories> categoryList = new List<Categories>();
- while döngüsü ile verilerimizi okuyoruz.
- Categories listemize Sql sorgumuzdan gelen ve SqlDataReader ile okuduğumuz datamızı ekliyor.
- cmbCategories.DataSource = categoryList; ile combobox nesnemin içerisine Category tipindeki listemi ekliyorum. Önemli: DataSource propertysi object tipinde olduğu için ben oluşturmuş olduğum bir sınıfı set edebildim.
- cmbCategories.DisplayMember = "CategoryName"; ile combobox'ın text özelliğinde ne yazacağını set ediyorum. Önemli: Categories class'ımın CategoryName propertysini set ettim. DisplayMember string tipinde olduğu için tırnaklar içerisinde vermek zorundayım.
- cmbCategories.ValueMember = "CategoryID"; ile combobox'ın value özelliğinde ne yazacağını set ediyorum. Önemli: Categories class'ımın CategoryID propertysini set ettim. ValueMember string tipinde olduğu için tırnaklar içerisinde vermek zorundayım.
Sıra geldi combobox kontrolümdeki category değiştiğinde o kategoriye ait toplam ürün sayılarını özelliğini label nesnemin text özelliğine yazmaya.
Dikkat Edilmesi Gerekenler!
- Combobox her değiştiğinde bu değişikliği yakalayabilmem için combobox'ımın SelectedIndexChanged event'ini açtım (cmbCategories_SelectedIndexChanged)
- Bu event içerisinde 2 adet değişken var sender ve EventArgs. Bizim işimiz şimdilik sender propertysi ile. Combobox değiştiğinde sender objesi combobox'ın event'i tarafından tetiklendiği için bir Comboboxtır! ve bunu ComboBox combo = (ComboBox)sender; casting işlemi ile gelen objenin bir combobox olduğunu söylüyoruz.
- Hala bizim ihtiyacımız olan CategoryID değişkenine ulaşamadık. Combobox'ın şöyle bir propertysi var SelectedItem ve dikkat ederseniz object tipinde. Hatırlıyorsanız yukarıda Combobox'ın itemlarını Categories listesi olarak belirlemiştik o halde SelectedItem bir Category nesnesidir diyebiliriz! Categories selectedCategory = (Categories)combo.SelectedItem;
- Artık Category nesnesi elimizde olduğuna göre istediğimiz gibi Sql sorgumuzu oluşturabiliriz 🙂
Umarım sizler için de okuması keyifli ve öğretici bir makale olmuştur.
Kaynak kodlar için : github
Bir sonraki makalemizde INSERT, UPDATE ve DELETE işlemlerini yapacağız.
Görüşmek üzere.
1 Comment
You can post comments in this post.
merhaba yigit , login sayfasını yapmam da yardımcı olabilrmsn trakya üniversitesi bilgisayar programcılıgı ögrencisiym , dönus yaparsan sevinirm.
Rojhat GÖKÇE 2 sene ago
Post A Reply