Kullanıcı Adı Kontrolü


Merhabalar,

Bugünkü yazımızın konusu başlıkta da belirtildiği üzere kullanıcı adının kontrolü olacaktır.
Yazdığımız programları kullanan insanlar ve bu insanların programımızda hesapları vardır. Söz konusu hesapların karışmaması adına kullanıcı kayıt işlemi yaparken belli noktalarda kontroller gerçekleştirmemiz gerekir. Örneğin kullanıcı bilgilerini girip kaydet butonuna bastığında kullanıcı ad ve e-mail adresinin veritabanımızda olup olmadığının kontrolu yapılmalı ve ancak girilen bilgilerin daha önceden başka bir kullanıcı tarafından alınmamış olması durumunda yeni kayıt işlemi gerçekleştirilmelidir.

Bu yazıda da kendimize sormamız gereken soru, C#’ta e-mail veya kullanıcı adı kontrolünü nasıl gerçekleştiririm olacaktır.

Bununla ilgili olarak önce veritabanımızı oluşturalım;
Ben Forum isimli bir database oluşturduktan sonra bu database içine Uyeler isimli tek bir tablo ekledim. Bu tabloyu aşağıda görebilirsiniz;


Veritabanımızı oluşturduktan sonra bir sonraki aşama arayüzün oluşturulmasıdır. Formunuzu aşağıdaki gibi basit bir şekilde tasarlayabilirsiniz.



Sıra geldi metotlarımızı yazmaya;

NOT: Burada yazacağımız metodun geri dönüş türü Boolean olacaktır. Aslında sebebi programı yazarken kendimize sorduğumuz soruda saklıdır. Veritabanında böyle bir “user name” var mı, böyle bir mail adresi var mı?  sorusunun cevabı tabiki var ya da yok olacaktır. Boolean türünün de iki değer aldığını (true, false) düşünürsek bu veri tipinin kullanılması işlerimizi kolaylaştıracaktır.

Metoda geçmeden önce, aşağıda 4 tane metot yer almaktadır. Bu 4 metot da aynı işi yapmaktadır. İlk metot ADO.NET’ten vazgeçemeyenler, ikincisi Linq ve üçüncüsü de Lambda expression kullanıcıları içindir. Dördüncü metot ise tek satır kod ile işlerimizi halledebilmek için verilen bir metot örneğidir.

    public bool KullaniciAdKontrol_1(string kullaniciAd)
    {
        //# Girilen kullanıcı adının veritabanında olup olmadığını Boolean değişken ile kontrol edeceğiz. sonuc değişkenimiz false ise girilen kullanıcı adı veritabanımızda yok demektir.
        bool sonuc = false;

        //# Klasik bağlantı işlemlerimiz..
        SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Forum;Integrated Security=True");

        //# StringBuilder yardımı ile Sql tümcemizi yazacağız. Dikkat! Sql Inception'lardan korunabilmek için her daim + ile string birleştirmelerden kaçının!
        StringBuilder builder = new StringBuilder();

        SqlCommand cmd = new SqlCommand(builder.AppendFormat("SELECT COUNT(ID) FROM Uyeler WHERE KullaniciAd = '{0}'", kullaniciAd).ToString(), con);

        //# Bağlantının durumu "kapalı"dan farklı ise bağlantıyı aç!
        if (cmd.Connection.State != ConnectionState.Open) cmd.Connection.Open();

        //# Sorgumuz sonucunda tek bir değer(int) dönecektir. Söz konusu değer girilen kullanıcı adına eşit olan kayıt sayısını verecektir. Bu sayının 0'dan büyük olması sonuc değişkeninin true değerini aksi durumda false değerini almasını sağlayacaktır.
        sonuc = Convert.ToInt32(cmd.ExecuteScalar()) > 0 ? true : false;

        con.Close();

        return sonuc;
    }

Linq teknolojisi ile bunu nasıl yaparız?

    public bool KullaniciAdKontrol_2(string kullaniciAd)
    {
        var sorgu = (from u in entity.Uyelers
                     where u.KullaniciAd == kullaniciAd
                     select u).Count();

        if (sorgu > 0)
            return true;
        else
            return false;
    }

Lambda expression kullanarak sorgumuzu biraz daha kısaltabiliriz. Nasıl mı! İşte cevabı;

    public bool KullaniciAdKontrol_3(string kullaniciAd)
    {
        var query = entity.Uyelers.Where(u => u.KullaniciAd == kullaniciAd).Count();

        if (query > 0)
            return true;
        else
            return false;
    }

Peki son yazmış olduğumuz metodun daha kısa bir hali var mıdır? Tabi ki vardır. Lambda expression yardımı ile metodumuzu tek satırda ifade etmek çok basit;

    public bool KullaniciAdKontrol_4(string kullaniciAd)
    {
        return entity.Uyelers.Where(u => u.KullaniciAd == kullaniciAd).Count() > 0 ? true : false;
    }

Bir sonraki yazımızda görüşmek dileğiyle, hoşçakalın..

Enumlarla Çalışmak

Merhabalar,

Bugün birlikte sabit olarak Türkçeleştirebileceğimiz enum’lar üzerinde duracağız. Öncelikle Enum’ları niçin kullanırız biraz bunun üzerinde duralım.

Arkadaşlar insanlara sabit seçeneklerin sunulması gerektiği anlarda enum tipine ihtiyaç duyarız. Nasıl mı, örneğin Cinsiyet bilgisi sabittir Erkek ve Kadın olmak üzere. Bir örnek daha verelim, bu da departmanlar olsun, bir şirketteki departmanlar (insan kaynakları, bilgi işlem, pazarlama vs) uzun yıllar boyunca değişmesi zor olan sabitlerdir esasında. Siz bu tarz verilerle karşılaşıp bunlar için veritabanınızda tablo oluşturmak yerine Enum’ları tercih edebilirsiniz. Bu sizi database üzerindeki bir tablonun yükünden kuratracak ve performans açısından daha verimli sonuçlar elde etmenizi sağlayacaktır.

Bir enumun class seviyesinde tanımlanabileceğini hatırlatıp bir senaryo üzerinden yazının konusu olan enumlarla nasıl çalışılır sorusunun cevabını aramaya başlayalım. Senaryomuz şu olsun;

X Üniversitesi Mezunlar Derneği’nin sahibi olduğumuzu düşünelim. Ve deneğe kayıt edeceğimiz üyelerimizin Ad, Soyad, Mail adresi ve öğrenim durumu bilgilerine ihtiyaç duyduğumuzu düşünelim. Şimdi gelin bunun için bir form hazırlayalım.



Bu formda bir tabControl kullanıyoruz ve 1. TabPage’de yukarıda da gördüğünüz gibi üye kaydetme işlemini gerçekleştiriyoruz. 2. TabPage ise kayıt ettiğimiz üyelerin gösteriminin yapılacağı sayfa olacaktır.



Üye ekleme işleminin yapılacağı tabPage’de öğrenim durumunun karşısında bir comboBox olduğu dikkatinizi çekmiştir. Bu comboBox, hazırlayacağımız enum için kullanacağımız kontrol olacaktır. Şimdi OOP’den de yardım alarak class ve enum’umumuzu oluşturalım;

    public enum OgrenimDurumu
    {
        Lise,
        Universite,
        Yuksek_Lisans,
        Doktora
    }

    public class Uye
    {
        public string AdSoyad { get; set; }
        public OgrenimDurumu Mezuniyet { get; set; }
        public string MailAdres { get; set; }

        public override string ToString()
        {
            return this.AdSoyad;
        }
    }

Enum ve class’ımız hazır olduğuna göre üye kayıtları gerçekleştirmeye başlayabiliriz. Yalnız unutmamamız gereken bir nokta var ki o da Form’un load’ında yani form yüklenirken combobox’ımızı OgrenimDurumu enumumuz ile doldurmaktır. Peki bunu nasıl yaparız? Bu sorunun cevabını aşağıdaki kod bloğunda bulabiliriz.

        private void Form1_Load(object sender, EventArgs e)
        {
            //# Enum tipi ile Combobox'ın içini nasıl doldururum?
            cbOgrenimDurumu.DataSource = Enum.GetValues(typeof(OgrenimDurumu));
        }

Bu kodun türkçesi şudur; öğrenim durumu tipinin değerlerini comboBox’ın veri kaynağı olarak ata. Combobox’ın veri kaynağını da belirledikten sonra kayıt yapmaya hazırız. Peki kaydet butonuna bastığımızda nasıl kayıt ekleyeceğiz? Arkadaşlar burada bir veritabanı kullanmayacağımız için kayıtları listbox’a doldurmamız yeterli olacaktır. Bunu sağlayacak kod bloğumuz ise aşağıdaki gibi olacaktır;

        private void btnEkle_Click(object sender, EventArgs e)
        {
            Uye eklenecekUye = new Uye { AdSoyad = txtAdSoyad.Text, Mezuniyet = (OgrenimDurumu)cbOgrenimDurumu.SelectedItem, MailAdres = txtMailAdres.Text };
            lstboxUyeler.Items.Add(eklenecekUye);
        }

Yukarıdaki kod bloğunda önemli olan kendisi de bir enum tipi olan Öğrenim Durumu property’sine atamayı nasıl gerçekleştireceğimizdi onu da combobox’ın seçili elemanını OgrenimDurumu enumuna çevirerek yaptık -> (OgrenimDurumu)cbOgrenimDurumu.SelectedItem.

Şimdi kaydettiğimiz bu üyeyi göstermeye geldi sıra. Dikkat edecek olursanız biz oluşturduğumuz üyeleri listbox’a ekliyoruz. Şimdi bu listbox’tan bir elemanın seçilmesi ile bilgileri pekala alıp sunabiliriz. Örnek olarak aşağıdaki kodu inceleyiniz;

        private void lstboxUyeler_SelectedIndexChanged(object sender, EventArgs e)
        {
            Uye seciliUye = lstboxUyeler.SelectedItem as Uye;
            lblAdSoyad.Text = seciliUye.AdSoyad;
            lblMezuniyet.Text = seciliUye.Mezuniyet.ToString();
            lblMail.Text = seciliUye.MailAdres;
        }

Bu kod bloğunda dikkate etmeniz gereken nokta enum tipi olan Mezuniyet’i ToString() metodu ile label’da göstermemizdir.

NOT : Enumların sayısal değerine ulaşmak için onları int ile convert etmeniz gerekmektedir. Örnek;
            lblMezuniyet.Text = ((int)seciliUye.Mezuniyet).ToString();


Bir sonraki yazımızda görüşmek dileğiyle, hoşçakalın..

Form Closing


Merhabalar,

Bu yazımızda formun kapatılma olayı üzerinde duracağız. Bazı programlarda Kapat butonuna bastığınızda “Gerçekten programı kapatmak istiyor musunuz?” şeklinde bir mesaj kutusu ile karşılaşırsınız.

Daha önce bunu merak ettiniz mi bilmiyorum fakat gelin programcıların bunu nasıl başardıklarını inceleyelim ve aynı mesajı biz de verelim.

Öncelikle adım adım giderek kendimize belli sorular soralım.

1.  Bu işlem için hangi event’i kullanacağım?

Bu mesaj form kapatılırken gösterildiği için doğal olarak Formun kapatılma (Form Closing) eventinden yararlanacağız.

2.  Kullanıcının cevabını nasıl yakalarım?

Söz konusu event içine Message box’ınızı yazarsınz ve kullanıcıdan bir cevap alacağımız için Message box’ın butonlarının amacınıza uygun olması için tasarlarsınız. Bunun için YesNo kullanabilirsiniz. Kullanıcının cevabı için de DialogResult size hizmet vermektedir.

3.  Cevaba göre formu nasıl yönlendireceğim?

Tam da bu soru düşünülüp cevabı bizim için hazırlanmıştır. FormClosingEventArgs’tan alınan bir nesnenin Cancel property’sinin true olması programın kapatılmasının önüne geçecektir.

Şimdi gelin bu süreci program dilinden çıkartarak Türkçeleştirmeye çalışalım. Formun kapatılma olayından (FormClosingEvents) alınan bir nesne içinde Cancel (iptal etmek) özelliğini barındırmaktadır. Dolayısıyla “e.Cancel = true” ifadesi formun kapatılmasının iptaline evet yanıtının verilmesinden başka bir şey değildir.

Yukarıdaki açıklamaların örneği olan kod bloğu aşağıdadır;

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult dr = MessageBox.Show("Gerçekten programı kapatmak istiyor musunuz?", "Closing event", MessageBoxButtons.YesNo);

            if (dr == DialogResult.No)
                e.Cancel = true;
            else
                e.Cancel = false;
        }

Herkese iyi çalışmalar, hoşçakalın..

101 Linq Örneği - Part I

Merhabalar,

Bugün C# 3.0 ile hayatımıza giriş yapan LINQ (Language Integrated Query) teknolojisini daha etkin kullanabilmek için örnek sorgular gerçekleştireceğiz. 

Bu yazımızda kendimize soracağımız sorular şunlar olacak:

  1. Linq ile insert, update, delete işlemlerini nasıl gerçekleştiririm?
  2. Linq ile karmaşık select sorgularını nasıl yazarım?

İki ana başlıkta toplamaya çalıştığım sorulara yanıt aramaya çalışacağız ve Linq teknolojisi kullanarak programlarımızda nasıl zaman tasarrufunu gerçekleştirdiğimizi aynı zamanda program yazmayı nasıl  daha eğlenceli hale getirdiğimizi hep beraber göreceğiz.

Ben Linq hakkında giriş bilgisine sahip olduğunuzu düşünerek örnekler yardımıyla söz konusu teknolojiye derinlemesine hakim olmanıza yardımcı olmaya çalışacağım. Bunun için öncelikle Visual Studio içerisinde bir Console projesi açalım ve projeniz üzerine sağ tık "Add / New Item / ADO.NET Entity Data Model" yoluyla projenize bir entity ekleyin. Açılacak bir sonraki pencerede "Generate From Database" varsayılan olarak işaretli gelecektir Next tuşu ile devam edin. Sırada veritabanınızı seçme işlemi var. Burada Northwind veritabanını seçin ve devam edin. Bu noktada dikkat etmeniz gereken nokta Visual Studio'nun App.Config dosyanıza bağlantı sözcüğünüzü otomatik ekliyor olmasıdır. Söz konusu connection string'i aklınızda tutmanız sizin için faydalı olacaktır. Zira programlarımızı yazarken bu bize lazım olacaktır.

ConnectionString

Next diyerek bu adımı da gerçekleştirdikten sonra son aşamaya geldiğimizin müjdesini verebilirim :) Bu aşamada bize sorulan soru şudur : "Hangi database nesnelerinin model içinde yer almasını istiyorsunuz?". Burada resimde de görüldüğü üzere tablolarımız haricinde Stored Procedure ile View'leri de modelimize dahil edebiliriz. Bunun haricinde altta yer alan iki checkbox'tan birincisi sahip olduğumuz nesnelerimizin çoğul isimlerini otomatik olarak oluştururken ikincisi ise yabancıl anahtar (foreign key) kolonlarının model içerisinde yer almasını sağlamaktadır.



Entity Model'imizi projemize ekledikten sonra Linq sorgularımızı yazabiliriz. Hadi şimdi birlikte yazının başındaki sorularımıza cevap arayalım. 

Öncelikle insert, update, delete;

  • Soru : Kategoriler (Categories) tablosuna kayıt ekleme işlemini nasıl gerçekleştirebiliriz?
        public static bool Insert()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                Category yeniKategori = new Category { CatName = "Sea food", Description = "This is a sea food" };

                entity.AddToCategories(yeniKategori);

                return entity.SaveChanges() > 0 ? true : false;
            }
        }



Hazırlamış olduğumuz Entity Modelimizden bir instance alarak eklemek istediğimiz kategoriyi AddToCategories() metodu yardımıyla veritabanımıza ekliyor ve daha sonra da değişiklikleri kaydetmesi için SaveChanges() metodunu çalıştırıyoruz. Burada dikkat edilmesi gereken nokta söz konusu metodun int dönmesidir. Biz bu sayede ekleme işlemimizin başarılı olup olmadığı bilgisini metottan alabiliyoruz. Son olarak kod bloğumuzu using içinde yazmamızın nedeni ise ekleme işlemi sonunda entity nesnesinin "Garbage Collector" yardımıyla RAM üzerinden atılmasını gerçekleştirerek gereksiz yere RAM'de durmasının önüne geçmektir.


  • Soru : Kategoriler tablosu üzerinde güncelleme işlemini nasıl yaparız?
        public static bool Update()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                Category kategori = new Category { ID = 36, CatName = "New Sea food", Description = "This is a new sea food" };

                var originalCategory = entity.Categories.Where(c => c.ID == kategori.ID).SingleOrDefault();

                entity.Categories.ApplyCurrentValues(kategori);

                return entity.SaveChanges() > 0 ? true : false;
            }
        }


Güncelleme işlemi önce orjinal bilginin elde edilip daha sonra yeni gelen ile değiştirilmesi ile gerçekleştiriliyor.

  • Soru : Kategoriler tablosu üzerinde Delete işlemini nasıl yaparız?
        public static bool Delete(int ID)
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                var silinecek = from c in entity.Categories
                                where c.ID == ID
                                select c;

                entity.DeleteObject(silinecek.SingleOrDefault());

                return entity.SaveChanges() > 0 ? true : false;
            }
        }


Silme işlemi de öncelikle silinecek değerin Categories varlığımızın içinde bulunması ile gerçekleşmektedir. Sonraki aşamalar ise yukarıdaki Insert() ve Update() metotlarının birer taklididir.

Insert, Update, Delete sorgularımızı inceledikten sonra 3 adet select işlemi yaparak Linq örmekleri ile ilgili yazı serimizin ilkini noktalayalım.

  • Soru : Tüm kategorileri nasıl getirebiliriz?
        public static List<Category> TumKategoriler()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                var kategoriler = from c in entity.Categories
                                  select c;

                return kategoriler.ToList();
            }
        }


Söz konusu kategorileri içine sadece Category class'ını alan bir List olarak döndürmek mantıklıdır. Peki bu liste nasıl hazırlanacak? Cevabı oldukça basit, entity.Categories içindeki tüm elemanlar seçilecek (select c). Sonrasında da dönüştürme operatörü (ToList) ile bunu metodun dışına göndereceğiz.

Bu noktada yazdığımız metodun nasıl kullanacağını da gösterirsek bu sorunun cevabını tam olarak vermiş oluruz;


        static void Main(string[] args)
        {
            foreach (var item in TumKategoriler())
            {
                Console.WriteLine(item.CatName);
            }
        }             


TumKategoriler() bir list olduğu için bu listenin içinde foreach döngüsü ile gezerek elemanlarını tek tek ekrana yazdırabiliriz. Yukarıda olduğu gibi.

  • Soru : ID'ye göre seçme işlemini nasıl yapabilirim? Örneğin ID'si 2 olan bir Category'i nasıl seçebilirim?
        public static Category CategoryGetirByID(int ID)
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                var kategori = from k in entity.Categories
                                     where k.ID == ID
                                     select k;

                return kategori.SingleOrDefault();
            }
        }

Bunun için kategoriler içinde gezerek kategori id'si istenilen id'ye eşit olan kayıt bulunur. Daha sonrasında da o kayıt metot dışına gönderilir.

  • Soru : Kaç adet kategoriye sahip olduğumu nasıl görebilirim?
        public static int KategoriAdet()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                var kategori = from k in entity.Categories
                               select k;

                return kategori.Count();
            }
        }

Burada imdadımıza yetişen görüldüğü gibi Count() metodu oldu.

Sonuç olarak bu yazımızda Linq ile daha az kod yazıp daha az zaman israfı gerçekleştirdik ve kod dünyasının daha keyifli bir hal aldığını gördük.

Bir sonraki yazıda görüşmek üzere :))