24 Nisan 2007 Salı

c# ders notları

ÇOK BOYUTLU DİZİLER VE MATRİSLER

 

private void button1_Click(object sender, EventArgs e)

        { short [,] b=new short [2,2];

           short [,] c=new short  [2,2];

         

            b[0,0]=1;

            b[0,1]=2;

            b[1,0]=3;

            b[1,1]=4;

 

            c[0,0]=3;

            c[0,1]=5;

            c[1,0]=7;

            c[1,1]=9;

            int toplam=0;

 

            for (int i = 0; i < 2; i++)

                for (int j = 0; j < 2; j++)

                       for(int k=0;k<2;k++)

                             for(int l=0;l<2;l++)

                    toplam = toplam + b[i, j]+c[k,l];

 

            //MessageBox.Show("matrislerin toplamı "+toplam.ToString());

            textBox1.Text = "Matrislerin satır ve sütun sayıları toplamı aşağıdadır.";

 

            for (int i = 0; i < 2; i++)

                for (int j = 0; j < 2; j++)

                    listBox1.Items.Add(b[i, j].ToString()+"          "+c[i,j].ToString());

          

            listBox1.Items.Add("----------------------------");

            listBox1.Items.Add("Bu matrislarin toplamı=" + toplam.ToString());  

           

        }

BREAK VE CONTİNUE KOMUTLARI

 

private void button2_Click(object sender, EventArgs e)

        {

            for (int i = 0; i < 2; i++)

            {

                for (int j = 0; j < 2; j++)

                {

                    if (j == 2)

                        break;

                    MessageBox.Show(" break komutu döngüden çıkarır ve bir alt satıra geçer.");

                }

                MessageBox.Show("Buradan devam eder.");

            }

        }

 

 

private void button2_Click(object sender, EventArgs e)

        {

            for (int i = 0; i < 2; i++)

            {

                for (int j = 0; j < 2; j++)

                {

                    if (j == 2)

                       continue;

                    MessageBox.Show("continue komutu döngüden çıkarır ama bir üst komuta geçer.(2.if komutu çalışır)");

                }

                MessageBox.Show("daha sonra bu çalışır.");

            }

        }

 

 

 

 

 

 

WHİLE VE DO WHİLE DÖNGÜSÜ

 

int i = 5;

            while (i < 4)

            {

                MessageBox.Show(i.ToString());

                i++;

            }

NOT:burada ilk önce şarta bakar daha sonra şart uygunsa döngüye

girer.

 

int i = 5;

do

  {

    MessageBox.Show(i.ToString());

     i++;

   }

 while (i < 4)

 

NOT:burada ise şartta bakmaksızın ilk önce döngüyü çalıştırır.

Bir defaya mahsus olarak.

 

 

FOREACH DÖNGÜSÜ

 

  short [] dizi= new short [3];

            dizi[0]=1;

            dizi[1]=2;

            dizi[2]=3;

 

            foreach (int k in dizi)

            {

             MessageBox.Show(i.ToString());

            }

 

             for (int j = 0; j < 3; j++)

             {

                 MessageBox.Show(dizi[i].ToString());

             }

 

 

NOT: burada dizi dizisinin elemanlarını for döngüzüde foreach döngüsüde ekarana yazdırır.ama aradaki fark foreach komutuyla dizinin elemanlarının sayısıyla uğraşmıyoruz for daki gibi.

 

REF KOMUTU

 

    private void button1_Click(object sender, EventArgs e)

        {

            int a = 5;

            object o = a;

            a = Convert.ToInt32(o) + 1;

            o = a;

            MessageBox.Show(a.ToString());

 

 

            sayiartir(a);

        }

 

        void sayiartir(int i)

        {

            i++;

        }

 

Eğer burada ref kullanılmazsa sayiartir() fonksiyonu değer döndürmediği için a sayısı artmaz. Ama ref komutu kullanılırsa ;

 

private void button1_Click(object sender, EventArgs e)

        {

            int a = 5;

            object o = a;

            a = Convert.ToInt32(o) + 1;

            o = a;

            MessageBox.Show(a.ToString());

            sayiartir(ref a);

        }

 

        void sayiartir( ref int i)

        {

            i++;

        }

 

A sayısının değeri ref sayesinde artmış olur.birden fazla değer döndürmek için ref kullanılır.

 

 

private void button1_Click(object sender, EventArgs e)

        {

            int a = 5;

           string ad = "alper";

            int b = 3;

            sayiartir(ref a,ref b,ref ad);

            MessageBox.Show(a.ToString()+b.ToString()+ad);

        }

 

        void sayiartir( ref int i,ref int j,ref string s)

        {

            i++;

            j += 2;

            s += " deneme";              

         }

 

Void fonksiyonlarda kesinlikle return kullanılmaz.Çünki geriye bir değer döndürülmüyor.

 

Eğer bir değer döndürülmek isteniyorsa;

private void button1_Click(object sender, EventArgs e)

        {

            int a = 5;

           string ad = "alper";

            int b = 3;

            sayiartir(ref a,ref b,ref ad);

            MessageBox.Show(a.ToString()+b.ToString()+ad);

       

        }

 

     bool sayiartir( ref int i,ref int j,ref string s)

        {

            i++;

            j += 2;

            s += " deneme";

 

            return false;                     

     }

 

Burada false değerini bool tipi sayiartir fonksiyonu döderir.

 

Buarada ref tipi değişkenler için ref komutu kullanılması gerekmez.

Şöyle;

 

 

      private void button1_Click(object sender, EventArgs e)

        {

            int i = new int[3];

            i[0] = 1;

            i[1] = 2;

            i[2] = 3;

            refartir(i);

 

        }

       void refartir(int [] sayi)

        {

            sayi[0] += 2;

        }

 

Burada  i bir adres tuttuğu için ref tipi bir değişkendir.

Dolayısıyla refartir() fonksiyonu ref kullanılmadan da geri değer döndürür.

CLONE  YÖNTEMİ

Eğer biz bir değerimizi değiştirmek istemiyorsak onu clonlayıp gönderebiliriz.

 

 

        private void button1_Click(object sender, EventArgs e)

        {

            int [] i = new int[3];

            i[0] = 1;

            i[1] = 2;

            i[2] = 3;

            object b = i.Clone();

            refartir((int [])b);

 

        }

       void refartir(int [] sayi)

        {

            sayi[0] += 2;

        }

 

Böylece i dizimizi klonlamış olduk i dizimizin değeri değişmezken klonladığımız b dizi halini allır ve onun değeri değişir.

Yalnız b objesini gönderirken onu int diziye çeviriyoruz.

 refartir((int [])b);

 

 

    private void button1_Click(object sender, EventArgs e)

        {

            int [] i = new int[3];

            i[0] = 1;

            i[1] = 2;

            i[2] = 3;

          int [] b = i;

            refartir(b);

            MessageBox.Show(i[0].ToString());

        }

     Yukarıdaki bu örnekte ise  b ref tipi bir değişken olduğundan ve ide aynıtürden bir değişken olduğundan b i nin tuttuğu adresi alır ve i nin içeriğini değiştirir.

 

CLASS YAPISI

 

Faktöryel Hesaplama (for döngülü);

 

  private void button1_Click(object sender, EventArgs e)

        {

            int b=Convert.ToInt32( textBox1.Text) ;

            int fakt= faktoryelhesapla(b);

            MessageBox.Show(fakt.ToString());

        }

 

        int faktoryelhesapla(int a)

        {

            int sonuc = 1;

 

            for (int i = a; i > 0; i--)

            {

                sonuc *= i;

            }

            return sonuc;

        }

 

Faktöryel Hesaplama (Rekursif fonksiyonlu);

 

 

 int rekursive_fonk(int b)

        {

              if (b == 1)

                return 1;

              else

                return b * rekursive_fonk(b - 1);

        }

 

        private void button1_Click_1(object sender, EventArgs e)

        {

            int b = Convert.ToInt32(textBox1.Text);

            MessageBox.Show(rekursive_fonk(b).ToString());

    

        }

 

Rekürsif fonksiyonlar sonu belli olmayan durumlarda işlevseldir.herzaman for döngüsü kullanılmaz."örneğin ağımdaki tüm bilgisayarları tara ve bittiği yerde geri dönerek bana sonuç ulaştır." Vs.

 

 

CLASS YAPISI

 

Class yapısında önemli olan kendi istediğimiz kodlamaları yazabiliriz. Ve biz bu sınıf içindeki değerleri public tanımlayarak o sınıfın değişkenlerini heryerde kullanabiliriz.

 

 

class Ogrenci

    {

        public string OgrenciNo = string.Empty;

        public string Ad = string.Empty;

        public string Soyad = string.Empty;

        public DateTime DogumTarihi;

        public string Bolumu = string.Empty;

        public int sinifi;

        public bool BursAliyormu = false;

 

Ogrenci classında public tanımlarsak diğer cs ler içinde bu değişkenleri değiştiririz.örnek olarak formun loadında bu değişkenlere değer atadık.Aşağıdaki örnek

 

Bu şekilde eklenir.

 

private void Form1_Load(object sender, EventArgs e)

        {

            Ogrenci o = new Ogrenci();

            o.Ad="Ahmet";

            o.Bolumu="Mat";

            o.BursAliyormu=true;

            o.DogumTarihi=new DateTime(1999,10,5);

            o.OgrenciNo="0111123";

            o.sinifi=4;

            o.Soyad="asma";

            MessageBox.Show(o.AdSoyad);

       

            Ogrenci o2 = new Ogrenci();

            o.AdSoyad="mehmet asma"

            o.Bolumu="kimya";

            o.BursAliyormu=true;

            o.DogumTarihi=new DateTime(1999,10,5);

            o.OgrenciNo = "0122235";

            o.sinifi=4;

                     

        }

 

 

CLASSLARIMIZDA PROPERTİES TANIMLAMAK

 

class Ogrenci

    {

        private string OgrenciNo = string.Empty;

        private string Ad = string.Empty;

        private string Soyad = string.Empty;

        private DateTime DogumTarihi;

        private string Bolumu = string.Empty;

        private int sinifi;

        private bool BursAliyormu = false;

 

        public string AdSoyad

        {

            get

            {

                return Ad + " " + Soyad;

            }

 

            set

            {

                Ad = value.Substring(0, value.Indexof(" "));

                Soyad = value.Substring(value.IndexOf(" ") + 1);

            }

        }

 

        public string AdSoyad 

 

bu  bizim classımızın özelliği oldu(properties).

Bunun 2 tane alt durumu var. Get ve set durumu

 

Get durumu sadece istediğimiz durumu get in içinde istediğimiz şekilde gelmesini sağlar.

 

MessageBox.Show(o.AdSoyad); bu şekilde çağırdığımızda gider Ogrenci clasının Adsoyad özelliğininin get durumunu çağırır.

Çünki biz burda adsoyad durumuna bir set yapmıyoruz.

ama değer atamak istediğimizde bu set durumunu aktif hale getirir.

 

Ogrenci o2 = new Ogrenci();

            o.AdSoyad="mehmet asma"

            o.Bolumu="kimya";

            o.BursAliyormu=true;

            o.DogumTarihi=new DateTime(1999,10,5);

            o.OgrenciNo = "0122235";

            o.sinifi=4;

 

yukaridaki örnekte o.AdSoyad="mehmet asma"

diyerek buna "mehmet asma "  ismini atamak istiyoruz.bu da gidip set durumunu aktif hale getiriyor ve ad kısmına boşluğu buluncaya kadarki harflaeri alıyor.( value.Substring(0, value.Indexof(" "));

) "mehmet" soyad kısmına ise boşluktan sonraki kısmını alıyor.( value.Substring(value.IndexOf(" ") + 1)) "asma" yı yazıyor.

 

 

Get ve Set  olayını private değişkenleri dışardan çağırmak veya değiştirmek için kullanabiliriz.

 

 

 

 

CLASSLARIMIZDA METOD TANIMLAMAK.

 

public void OgrenciEkle(string OgrenciNo, string Ad, string Sonismi, DateTime DogumTarihi, string Bolumu, int sinifi, bool BursAliyormu)

        {

            this.Ad = Ad;

            Soyad = Sonismi;

            this.DogumTarihi = DogumTarihi;

            this.Bolumu = Bolumu;

            this.BursAliyormu = BursAliyormu;

            this.sinifi = sinifi;

            this.OgrenciNo = OgrenciNo;

        }

Burdaki this yapısı

 

Değerler private olacak.ki değerler dışardan değiştrilmesin ve this yapısı kullanılabilsin.

       private string OgrenciNo = string.Empty;

        private string Ad = string.Empty;

        private string Soyad = string.Empty;

        private DateTime DogumTarihi;

        private string Bolumu = string.Empty;

        private int sinifi;

        private bool BursAliyormu = false;

böylece bu metod formun içinden çağrılıp değerler atanır.

 

 o.OgrenciEkle("123456", "ali", "veli", new DateTime(2004, 12, 04), "fen", 5, false);  

 

peki biz niye his kullandık? Şöyle ki metodumuzda ki değişkenimizde ad ismini taşıyor,clasımızdaki değişkenimizde ad isminde bir karışıklık olmasın diye tis kullanarak metodun dışındaki değişkeni gösteriyoruz. Eğer metodumuzdaki değişkenimiz farklı isimde olsaydı buna gerek kalmayacaktı.

  class Ogrenci

    {

        private string OgrenciNo = string.Empty;

        private string Ad = string.Empty;

        private string Soyad = string.Empty;

        private DateTime DogumTarihi;

        private string Bolumu = string.Empty;

        private int sinifi;

        private bool BursAliyormu = false;

 

        public string AdSoyad

        {

            get

            {

                return Ad + " " + Soyad;

            }

 

            set

            {

                Ad = value.Substring(0, value.IndexOf(" "));

                Soyad = value.Substring(value.IndexOf(" ") + 1);

            }

        }

 

        public void OgrenciEkle(string OgrenciNo, string Ad, string Sonismi, DateTime DogumTarihi, string Bolumu, int sinifi, bool BursAliyormu)

        {

            this.Ad = Ad;

            Soyad = Sonismi;

            this.DogumTarihi = DogumTarihi;

            this.Bolumu = Bolumu;

            this.BursAliyormu = BursAliyormu;

            this.sinifi = sinifi;

            this.OgrenciNo = OgrenciNo;

        }

    }

 

Constructer YAPISI

       

        //default Constructer

       

        public Ogrenci()

        {

        }

       

        //parametreli Constructer

       

        public Ogrenci(string ad, string soyad)

        {

            Ad = ad;

            Soyad = soyad;       

        }

 

Bu ne işe yarar. Şöyleki initial değerler atamak için kullanırız. Böylece classımızın nasıl başlamsı gerketiğini belirleriz.

 

      private void Form1_Load(object sender, EventArgs e)

        {

            Ogrenci o = new Ogrenci();

 

            Ogrenci o2 = new Ogrenci("alper", "metin");

        }

 

------------------------------------------------------------

            Ogrenci o = new Ogrenci();

            o.OgrenciNo = "123";

            Ogrenci o1 = new Ogrenci();

            o1=o;

            o1.OgrenciNo="4321";

            MessageBox.Show(o.OgrenciNo);

 

Burada  new ile ouşturduğumuz o ve o1 bir adresi gösterir.

o1=o;

Dolayısıyla yukarıdaki kodda o1 artık o'nun adresini almıştır.

Dolayısıyla o'nun öğrenci nosu ilkönce "123"iken artık o1 de o 'nun adresini gösterdiğinden içeriğini "4321" yapar.

 

OVERLOADIG (AŞIRI YÜKLEME)

Aynı fonksiynu farklı parametrelerle çağırabiliriz.

 

 

ENUM YAPISI

 

  class Araba

    {

        public enum Renkler {kırmızı,sarı,mavi,lacivert};

        private Renkler m_Renk;

       

          public Renkler Renk

        {

            get

            {

                return  m_Renk;

            }

            set

            {

                m_Renk=value ;

            }     

        }

Burada biz enum kullanarak renkler isminde bir tip tanımlamış oluruz.int ,string gibi vs

Böylece aşağıdaki  kodu yazarsak araba classının renkler isminde ki özelliğinin renklerini(sarı,mavi vs) kullanıcıya kısıtlamış şekilde kullandırırız. Bu gibi durumlarda enum işe yarar.

 

Araba a = new Araba();

a.Renk = Araba.Renkler.sarı;

MessageBox.Show(a.Renk.ToString());

Const değşkenleri ne ancak class üzerinden ulaşılır instance ler sabit const değerler ulaşamazlar.bunu unutma

 

public const double toplama=3.98;

          

bu değere form classı içinden araba claasından oluşmuş olan a instancesi ulaşamaz.

 

Araba a = new Araba(); 

 

Ama araba classı buna ulaşır ama değiştiremez.

 

Araba.toplama = 4.0;

 

 

Eğer biz bir değeri kendi sınıfı değiştirsin ama dışardan ulaşanlar değiştiremesin diyorsak onun için readonly komutu kullanırız.

 

    public readonly int AktifBankaKodu = 14;

 

public void toplama()

        {

            AktifBankaKodu = 26;

        }

Bu class değiştirir.ama dışardan değiştirmek istediğimizde

 

a.AktifBankaKodu = 34;

 

değiştirilmez.

 

 

 

 

 

SINIF(CLASS) YAPISI NA DEVAM

 

  class Zaman

    {

        int saat;

        int dakika;

        int saniye;

 

        public Zaman(int h)

        {

            saat = h;

            dakika = 0;

            saniye = 0;

        }

        public Zaman(int h,int m)

        {

            saat = h;

            dakika = m;

            saniye = 0;

        }

        public Zaman(int h,int m,int s)

        {

            saat = h;

            dakika = m;

            saniye = s;

        }

 

    }

Bu şekilde tanımlama olabileceği gibi

    class Zaman

    {

        int saat;

        int dakika;

        int saniye;

 

        public Zaman(int h):this(h,0,0)

        {

        }

        public Zaman(int h, int m): this(h, m, 0)

        {

        }

        public Zaman(int h,int m,int s)

        {

            saat = h;

            dakika = m;

            saniye = s;

        }

    }

Bu şekilde yapılan tanımlamalar da this komutuyla  bu constructerları kod yazmaktan kurtarıyor.

 

Ödev:

dvd

Dvd manager

+Başlık: string

+fiyat:double

+id:int

+DvdS:Dvd[]

+Dvd(baslik:string,fiyat:double,id:int)

-Dvd()

+DvdManager(Dvdcount:İnt)

+Listele()

+Ekle(dvd:Dvd)

+ınfo(string);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CLASS'LARDA PROPERTİESLER

 

        private double en;

        private double boy;

       

       public double En

        {

           get

           {

              return  en;

           }

            set

           {

              if(value>0)

                en=value;

           }

         

        }

 

        public double Boy

        {

            get

            {

                return boy;

            }

            set

            {

                if (value > 0)

                    boy = value;

            }

 

        }

   Burda dikkat edilmesi gereken şey properties yazarken değerlerin private olarak tanımlanması gerekir.        private double en; vs.

 

 

 

Birde önemli bir nokta daha var.

 

 

 

        static public double En;

        static public double Boy;

       

        static void Main(string[] args)

        {            

            DörtgenSınıfı drt=new DörtgenSınıfı();

            Console.WriteLine("En değerini giriniz.");

            drt.En = Convert.ToDouble(Console.ReadLine());

            //   En=Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Boy değerini giriniz.");

            drt.Boy=Convert.ToDouble(Console.ReadLine());

            // Boy=Convert.ToDouble(Console.ReadLine());

            Console.WriteLine("Alan hesabı için A, Çevre hesabı için C değerini giriniz.");

 

Burada

    //   En=Convert.ToDouble(Console.ReadLine());

    //   Boy=Convert.ToDouble(Console.ReadLine());

           

Önemli bir nokta;en ve boy değişkenleri static metoddan çağırıyorsak bu değerlerde static olmak zorunda.

 

 

OPERATÖRLERİN AŞIRI YÜKLENMESİ

public void KomplekSayıOlustur()

        {

            if (gercekkök >= 0)

                Console.WriteLine(gercekkök.ToString() + "+" + sanalkök.ToString() + "i");

        }

        public static KompleksSayıSınıfı operator +(KompleksSayıSınıfı k1, KompleksSayıSınıfı k2)

        {

            KompleksSayıSınıfı kmtoplam = new KompleksSayıSınıfı();

            kmtoplam.gercek = k1.gercek + k2.gercek;

            kmtoplam.sanal=k1.sanal+k2.sanal;

            return kmtoplam;

        }

        public static KompleksSayıSınıfı operator -(KompleksSayıSınıfı k1, KompleksSayıSınıfı k2)

        {

            KompleksSayıSınıfı kmtoplam = new KompleksSayıSınıfı();

            kmtoplam.gercek = k1.gercek- k2.gercek;

            kmtoplam.sanal = k1.sanal - k2.sanal;

            return kmtoplam;

        }

        public static bool operator ==(KompleksSayıSınıfı k1, KompleksSayıSınıfı k2)

        {

            if (k1.gercek==k2.gercek && k1.sanal==k2.sanal)

             return true;

            else

            return false;

        }

         public static bool operator !=(KompleksSayıSınıfı k1, KompleksSayıSınıfı k2)

        {

            return !(k1==k2);

        }

       

        public static implicit operator double(KompleksSayıSınıfı k1)

        {

            return k1.gercek;/*ya iimplicit ya explicit tanımlanmalıdır.aynı anda ikisi birden tanımlanamaz.*/

        }

 

        //public static explicit operator double(KompleksSayıSınıfı k1)

        //{

        //    return k1.gercek;

        //}

 

Bu durumda

           

  //  gercelkökü= km3 /*implicit olduğu zaman bu işlemi yapar.*/;

 

Yani bu işlem direk çalışır ama bu doğru bir durum değildir.Çünki bu işlemi bir başkası incelediğinde anlayamayabilir.

 

Ama  aşağıdaki durum olursa

        //public static implicit operator double(KompleksSayıSınıfı k1)

        //{

        //    return k1.gercek;/*ya iimplicit ya explicit tanımlanmalıdır.aynı anda ikisi birden tanımlanamaz.*/

        //}

        public static explicit operator double(KompleksSayıSınıfı k1)

        {

            return k1.gercek;

        }

 

Bu sefer bu doğru çalışır.Yani ısrarla dönüşüm değeri ister.

 

double gercelkökü;

 gercelkökü = Convert.ToDouble(km3);

 

 

28.01.2006//Cumartesi

 

Canlıların sınıflandırılması....ile ilgili çalışma yap

 

Abstract                                             Protected

Namespace                                         Interface

Overload                                            Sealed

Override                                             Public

İnheritance                                         Private

Static

 

Bu kavramları iyice oturtmak lazım.

 

Static classların içindeki değişkenlerde static olmak zorundadır.memberler ve fonksiyonlarda static olmak zorundadır.

                    

namespace emlakçı

{

    class EmlakLibrary

    {

        public double KomisyonHesapla(double satisDegeri)

        {

            return satisDegeri * 0.03;

        }

    }

}

 

Diyelim ki bu sınıfımız static değil bu durumda  bu sınıfın çağrıldığı yerde yeni instance ler oluşturmak gerekiyor..

 

  private void btnKomisyonHesapla_Click(object sender, EventArgs e)

        {

            villa v = new villa();

            v.Fiyati = 10000;

            EmlakLibrary emlklibrary = new EmlakLibrary();

            double sonuc=emlklibrary.KomisyonHesapla(v.Fiyati);

            MessageBox.Show(sonuc.ToString());

 

            arsa ars = new arsa();

            ars.Fiyati = 2000;

            sonuc = emlklibrary.KomisyonHesapla(ars.Fiyati);

            MessageBox.Show(sonuc.ToString());

 

      }

 

Ama bunu static yapınca

 

   static class EmlakLibrary

    {

        public static double KomisyonHesapla(double satisDegeri)

        {

            return satisDegeri * 0.03;

        }

    }

 

O zaman bunu şu şekilde çağırabiliriz.

 

 

        private void btnKomisyonHesapla_Click(object sender, EventArgs e)

        {

            villa v = new villa();

            v.Fiyati = 10000;

            double sonuc=EmlakLibrary.KomisyonHesapla(v.Fiyati);

            MessageBox.Show(sonuc.ToString());

 

            arsa ars = new arsa();

            ars.Fiyati = 2000;

            sonuc = EmlakLibrary.KomisyonHesapla(ars.Fiyati);

            MessageBox.Show(sonuc.ToString());

        }

Dolayısıyla burda instance oluşturmamıza izin vermez.

İnstance almadan oluşturur. EmlakLibrary.KomisyonHesapla(ars.Fiyati);

Çünki bu yapı statictir.

 

Yine biz yeni oluşturduğumuz classımızda istediğimiz metotları static yaparak onu memory de tutarız ve değişmez.

 

 

VERİ TABANI YÖNETİM SİSTEMİ VE SQL

 

 

SELECT AD,SOYAD,

CASE

WHEN IKINCIAD IS NULL THEN 'BELİRTİLMEMİŞ'

ELSE IKINCIAD

END IkinciAd

 FROM HST_KIMLIKBILGILERI

WHERE AD IN('yavu','mahmut')

 

YAVU        ŞENGÖZ       SELİM

MAHMUT   HAKTAN       BELIRTILMEMIS

 

 

 

VERİ TABANI YÖNETİM SİSTEMİ

 

DATABASE

 

CONNECTİON=Database bağlanmak için kullanılır

 

COMMAND=databese den veri çekmek için kullanılır (update,insert,delete,select ve scalar sonuçlar için kullanılır.bu aşamada 2 yöntem belirir.ya database den toplu veri çekilir yada database ile devamlı iletişim halinde bulunulup istedikçe veri alınır.)

 

     ONLİNE(database ile devamlı iletişim halinde bulunulur.)

  

          DATAREADER

 

     OFFLİNE(database den toplu veri çekilip sanki database üzerinde işlem yapılıyormuş gibi olması)

 

          DATAADAPTER

 

          DATASET

 

PROGRAM

 

 

 

 

SQL CONNECTION BAĞLANTI YAPISI

 

 private void button1_Click(object sender, EventArgs e)

        {

            SqlConnection sconnect = new SqlConnection();

            try

            {

                sconnect.ConnectionString = "Data Source=.;Initial Catalog=Hastane;User Id=sa;Password=;";

                sconnect.Open();

                //MessageBox.Show("bağlantı kuruldu");

 

                SqlCommand sCommand = new SqlCommand();

                sCommand.Connection = sconnect;

                try

                {

                    sCommand.CommandText = @"insert into HST_KIMLIKBILGILERI(ad,soyad)

                                                           values(' " + ad.Text + " ',' " + soyad.Text + " ')";

                    sCommand.ExecuteNonQuery();//etkilenen kayıt sayısını gösterir...//

                    MessageBox.Show("kayıt eklendi");

                }

 

                catch (Exception exp)

                {

                    MessageBox.Show(exp.Message);

                }

            }

            catch

            {

                MessageBox.Show("bağlantı kurulamadı");

            }

            finally

            {

                sconnect.Close();

            }

        }

 

        Yukarıda dikkat edilmesi gereken en önemli şey insert ,update ,delete yapılırken commend cümlesini executenonquery fonksiyonun kullanılması gerekir.

 

        Ama bunun dışında kullanılırsa örneğin select cümlesi o zaman da executescalar fonksiyonu kullanılmalıdır.

 

      Aşağıdaki buna örnektir.

 

     sCommand.CommandText = @"select  count(*) from HST_KIMLIKBILGILERI

                                                                select SCOPE_IDENTITY();";

                    object o = sCommand.ExecuteScalar();

                    MessageBox.Show(o.ToString());

 

    Burda  select SCOPE_IDENTITY()  cümleciği girilen son kaydın id sini verir.

 

  Executescalar cümleciği tek bir değer dönderir.ilk sütun ilk satırın değerini dönderir.

Yani select  * from HST_KIMLIKBILGILERI deseydik bize yine tek bir değer dönderirdi.

 

 

 

PARAMETRE KULLANIMI İLE İNSERT YAZIMI

              

SqlParameter sParams = new SqlParameter();

                sParams.ParameterName="@dogtar";

                sParams.DbType=DbType.DateTime;

                sParams.Value=txtDogtar.Text;

                cmd.Parameters.Add(sParams);

yukarıdaki parametre yazılımı aşağıdaki kod parçasında bu şekildede kullanılabilir 

SqlConnection sql = new SqlConnection();

            try

            {

                sql.ConnectionString = @"Data source=.;Initial Catalog=Hastane;User Id=sa;Password=;";

                sql.Open();

 

                SqlCommand cmd = new SqlCommand();

                cmd.Connection = sql;

                cmd.CommandText = @"insert into HST_KIMLIKBILGILERI

                                               (AD,SOYAD,DOGUMTARIHI)

                                               values(@ad,@soyad,@dogtar)

                                               select SCOPE_IDENTITY()";

                cmd.Parameters.AddWithValue("@ad", ad.Text);

                cmd.Parameters.AddWithValue("@soyad", soyad.Text);

              //  cmd.Parameters.AddWithValue("@dogtar", Dtp.Value);

               

                SqlParameter sParams = new SqlParameter();

                sParams.ParameterName="@dogtar";

                sParams.DbType=DbType.DateTime;

                sParams.Value=txtDogtar.Text;

                cmd.Parameters.Add(sParams);

 

                object o=cmd.ExecuteScalar();

                // cmd.ExecuteNonQuery();

                MessageBox.Show(o.ToString());

                MessageBox.Show("kayıt eklendi");

            }

           

 

Aşağıdaki şekildede yazılabilir.

 

 cmd.Parameters.AddWithValue("@dogtar", Dtp.Value);

               

peki biz niye en yukarıdaki gibi yazdık 4 satırda bunu yapmöamızın sebebi kullanıcının girdiği değeri ne olursa olsun type nı değiştirebiliriz. Ama yine de sistem ayarlarına bakılır yani bir türkçe yazılması ile ingilizce yazılması arasında fark vardır.

 

Onuda şöyle ayarlayabiliriz.

 

 sParams.Value = Convert.ToDateTime(txtDogtar.Text,                                                                                                                                                                                                

System.Threading.Thread.CurrentThread.CurrentCulture);

 

 

ONLİNE BAĞLANTI=

 

Online bağlantı devamlı olarak database bağlıdır ama tek satır döner.bu yüzden while veya for gibi döngülerle devamlı olarak çalışmasını sağlarız. Kodlaması ise aşağıdadır.

 

SqlConnection sql = new SqlConnection();

            try

            {

                sql.ConnectionString = @"data source=.;initial catalog=HASTANE;user id=sa;password=;";

                sql.Open();

 

                SqlCommand commend = new SqlCommand();

                commend.Connection = sql;

                commend.CommandText = "select AD+' '+SOYAD from HST_KIMLIKBILGILERI";

               

 

 

 

                SqlDataReader dr = commend.ExecuteReader();

                while (dr.Read()) //sonuna kadar oku demek....//

                {

                    cmb.Items.Add(dr[0].ToString());

                 }

              dr.close(); //devamlı açık kalmamasını sağlar

               

            }

            catch (Exception et)

            {

                MessageBox.Show(et.Message);

            }

 

 

OFFLİNE DATABASE YAPISI

 

 

              Yukarıdaki şekilde görüldüğü gibi dataset tüm db lerin kullanıdığı ayrı bir yapıdır.daha doğrusu her yapı kendi servisini kullanır.ama data seti hepsi kullanır.

Daha sonra bu dataseti kodlamamızda kullanırız.

 

 

Diyelim ki hiç dataset kullanmadan adapter kullanmadan nasıl kendi tablomuzu yaratır ve veri girer ve onu gridde gösteririz.

 

Aşağıda bunun kodlaması vardır.

 

 

private void button1_Click(object sender, EventArgs e)

        {

            DataRow dr1 = KimlikTablo.NewRow();

            dr1["NAME"] = txtad.Text;

            dr1["SURNAME"] = txtsoyad.Text;

 

            KimlikTablo.Rows.Add(dr1);

            dataGridView1.DataSource = KimlikTablo;

        }

 

  

 

 

 

 

     DataTable KimlikTablo = null;

 

        private void Form2_Load(object sender, EventArgs e)

        {

            KimlikTablo = new DataTable();

 

            DataColumn AdKolonu = new DataColumn();

            AdKolonu.ColumnName = "NAME";

            AdKolonu.DataType = typeof(string);

            AdKolonu.Caption = "Adı";

            AdKolonu.MaxLength = 50;

 

            KimlikTablo.Columns.Add(AdKolonu);

 

            DataColumn SoyadKolonu = new DataColumn();

            SoyadKolonu.ColumnName = "SURNAME";

            SoyadKolonu.DataType = typeof(string);

            SoyadKolonu.Caption = "Soyadı";

            SoyadKolonu.MaxLength = 50;

 

            KimlikTablo.Columns.Add(SoyadKolonu);

 

        }

    }

 

GDI(GRAFIC DESIGN INTERFACE)/*YENİ KOMPONENT DİSAYN İŞLEMLERİNİ YAPARIZ.*/

Primary key=unique değer olmalı ve index değer içermelidir.

 

 

 

 

 

 

SQL CÜMLECİĞİ

 

select

CASE

WHEN URN.ACIKLAMA IS NULL THEN 'BELÝRTÝLMEMÝÞ'

ELSE URN.ACIKLAMA

END ACIKLAMA

case

when URN.ID IS NULL then 0

else URN.ID

END ID, STS.SATILANADET from TBL_URUN URN

right JOIN TBL_SATIS STS on URN.ID=STS.URUNID

 

ÇİKOLATA                     1          30

SAKIZ                          2          20

BELİRTİLMEMİŞ           0          15

BELİRTİLMEMİŞ           0          20

 

 

USE ogrenci

 

SELECT OZL.AD,OZL.SOYAD,DRS.DERSADI,SNV.SINAVTURU,NTR.SINAVNOTU

FROM OGR_NOTLAR NTR

JOIN OGR_OZLUKBILGI OZL ON NTR.OGRENCIID=OZL.ID

JOIN OGR_DERSLER DRS ON NTR.DERSID=DRS.ID

jOIN OGR_SINAVTURU SNV ON NTR.SINAVTURUID=SNV.ID

 

 

 

 

 

 

 

 

Store procedure

 

 

alter procedure sp_satisdetay

@satis_id int ,@musteri_adi nvarchar(50) out,@urun_adi nvarchar(50) out

as

select @urun_adi=URN.ACIKLAMA,@musteri_adi=MST.ADI from TBL_SATIS STS

JOIN TBL_MUSTERI MST ON(STS.MUSTERIID=MST.ID)

JOIN TBL_URUN URN ON(STS.URUNID=URN.ID)

WHERE STS.ID=@satis_id

go

 

declare

@musteriad nvarchar(50),@urunad nvarchar(50)

 

exec sp_satisdetay 3,@musteriad out,@urunad out

print 'Müsteri Adý ='+@musteriad+ '   ürün adý ='+@urunad

 

 

Müsteri Adı =ÜLKER   ürün adı =ŞEKER

 

 

create procedure sp_GetCustomerInfo

@ID int,

@ADI varchar(50) out,

@TELNO varchar(50) out

as

set @ADI=(select ADI from TBL_MUSTERI where ID=@ID)

set @TELNO=(select TELNO from TBL_MUSTERI where ID=@ID)

go

 

declare

@AD nvarchar(50),@TELNO nvarchar(50)

 

exec sp_GetCustomerInfo 3,@AD out,@TELNO out

print 'Ad'+ @AD +' Tel No :'+ @TELNO

 

Ad SABANCI Tel No :345      

 

 

 

FUNCTİONLAR

 

CREATE FUNCTION fn_topla

(

      @sayi1 int,

      @sayi2 int

)

RETURNS int

AS

BEGIN

      RETURN @sayi1+@sayi2

END

GO

 

select dbo.fn_topla(5,2) function select le çağrılır.

 

create function AddStar(@Ad nvarchar(50))

returns nvarchar(20)

as

begin

return @Ad+'*'

end

Go

 

select dbo.AddStar('Alper')

 

Alper*

 

 

select ID,dbo.AddStar(ADI) from TBL_MUSTERI

 

1     ÜLKER*

2     ETİ*

3     SABANCI*

4     KOÇ*

 

 

create FUNCTION fn_satisadet

(

      @ID INT

)

RETURNS int

AS

BEGIN

 DECLARE @adet int     

 select @adet=SUM(STS.SATILANADET) from TBL_SATIS STS

   WHERE   STS.ID=@ID

  RETURN @adet

END

GO

 

select dbo.fn_satisadet(3)

20 /*sonuç*/

 

 

Diğer yapılış şekli...

 

 

alter FUNCTION fn_satisadet

(

      @ID INT

)

RETURNS int

AS

BEGIN

  RETURN (select SUM(STS.SATILANADET)

          from TBL_SATIS STS  WHERE STS.ID=@ID)

END

GO

 

select dbo.fn_satisadet(3)

 

 

CREATE procedure [dbo].[sp_eniyimusteri1]

 @ID int,

 @musteriad nvarchar(50) out

AS

begin

 

create table #GeciciTablo

(

 musteriid int,

 satilanadet int

)

 

insert into #GeciciTablo

SELECT MUSTERIID,SUM(SATILANADET) FROM TBL_SATIS

WHERE URUNID=@ID

GROUP BY  MUSTERIID

 

declare @musid int

 

SELECT @musid=musteriid from #GeciciTablo where satilanadet=

(select max(satilanadet) from #GeciciTablo)

 

select @musteriad=ADI from TBL_MUSTERI where ID=@musid  

drop table #GeciciTablo

END

 

TRİGGER LAR

 

3 tür trigger var dır.

 

Bunlar

İnsert ,update,delete

 

Bunu server bizim için çağırır.

 

CREATE TRIGGER  insert_kontrol

   ON  TBL_MUSTERI

  AFTER insert

AS

BEGIN

declare  @eklenenfirmaadi varchar(50)

select @eklenenfirmaadi=ADI from inserted

 

if(@eklenenfirmaadi='Eti')

 begin

    rollback;

    raiserror ('eti firmasýný ekleyemezsiniz',10,1)

 end

 

END

 

GO

 

alter TRIGGER  delete_kontrol

   ON  TBL_MUSTERI

  after DELETE

AS

BEGIN

declare  @eklenenfirmasayisi int

set @eklenenfirmasayisi=(select count(*) from deleted)

 

if(@eklenenfirmasayisi>2)

 begin

    rollback;

    raiserror ('silemezsin',10,1)

 end

 

END

GO

 

 

 

 

alter TRIGGER  SATIS_kontrol

   ON  TBL_SATIS

  AFTER insert

AS

BEGIN

declare  @silinenid int,

@satilanadet int,

@adet int,

@hatamesaji varchar(200),

@eksilenadet int

select @silinenid=URUNID,@satilanadet=SATILANADET from inserted

select @adet=ADET from TBL_STOK where URUNID=@silinenid

set @eksilenadet=(select @satilanadet-@adet)

if(@satilanadet>@adet)

 begin

    set @hatamesaji=(select 'yeterli stok yok'+convert(varchar,(@eksilenadet)))

    raiserror(@hatamesaji,14,5)

    rollback

 end

else

 begin

    update TBL_STOK  set ADET=@adet-@satilanadet  WHERE URUNID=@silinenid

 end

END

GO

 

 

İnserted tablosuna sadece bir tane kayıt yapılabilir.

 

Ama deleted tablosuna aynı anda birden fazla kayıt atılabilir.

Bundan dolayı deleted tablosunu çekerken mutlaka  where satırı kullanılmalıdır.

 

Fonksiyon işlemleri sadece dml işlemleri(insert ,update,delete,for vb gibi)yapar.

Procedure işlemleri ise ddl ve dml işlemlerinin hepsini yapar.

Trigger ise bir nevi fonksiyondur.

 

 

 

 

 

Cursorlar satır satır işlem yapar.

 

declare test cursor READ_ONLY

for select MST.ADI from TBL_MUSTERI MST

 

declare @ad varchar(50),@message1 varchar(100)

set @message1=''

open test

 

fetch next from test into @ad

while(@@fetch_status<>-1)/*sonuna ulaþmadýðýn sürece*/

 begin

  if(@@fetch_status<>-2)/*null dan farklýysa*/

   begin

     set @message1=(select @message1+ ','+@ad)

   end

 fetch next from test into @ad

end

close test

deallocate test

print substring(@message1,2,len(@message1)-1)

go

 

el_cevap=

 

ÜLKER,ETİ,SABANCI,KOÇ,a,g,h

 

 

 

 

 

 

 

 

 

 

declare test cursor READ_ONLY

for select URN.ACIKLAMA,STK.ADET from TBL_URUN URN

 JOIN TBL_STOK STK ON STK.URUNID=URN.ID

 

declare @stokad varchar(50),@adet int,@message1 varchar(200)

set @message1=''

open test

 

fetch next from test into @stokad,@adet

while(@@fetch_status<>-1)/*sonuna ulaþmadýðýn sürece*/

 begin

  if(@@fetch_status<>-2)/*null dan farklýysa*/

   begin

     set @message1=(select @message1+',ürün adý='+@stokad+ ' ürün adedi='+CONVERT(VARCHAR,@adet))

  

   end

 fetch next from test into @stokad,@adet

end

close test

deallocate test

 print substring(@message1,2,len(@message1)-1)

 

el_cevap:

 

ürün adı=ÇİKOLATA ürün adedi=5,ürün adı=SAKIZ ürün adedi=20,ürün adı=ŞEKER ürün adedi=20,ürün adı=LOKUM ürün adedi=40

 

 

2 yorum:

Mevlüt Altunay dedi ki...

mahmut kardeş bu notları paylaştığın için teşekkür ederim.

Adsız dedi ki...

S.a Mahmutcum büyük adamsın vesselam :)
devamlarını bekler cümle alem-i web..