Ç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:
mahmut kardeş bu notları paylaştığın için teşekkür ederim.
S.a Mahmutcum büyük adamsın vesselam :)
devamlarını bekler cümle alem-i web..
Yorum Gönder