2 Ocak 2014 Perşembe

Veritabanı Ders Uygulamaları - 11... Structın Veritabanı Bağlantılarında Kullanımı...

Yaptığımız uygulamalarda veritabanı bağlantılarını metodlar kullanarak yapabiliyoruz... İşlem kolaylığı açısından metodlar her zaman kullanışlı olmaktadır... Ama unutmamak lazım ki struct kullanarak bilgisayarımızın performansını artırabiliriz... 100 - 200 satırın olduğu bir veritabanı için çok bir farklılık göremeyebilirsiniz... Ama 10000 - 20000 verinin olduğu bir programda performans önemlidir... Struct tam da veritabanı bağlantıları için istediğimiz olay değildir aslında... Classları kullanmak daha mantıklı olacaktır... Kod kalabalıklığını kaldırmak ve erişilebilirliği daha rahat sağlamak için Classları daha sonraki örneklerimizde kullanacağız... 
Bu örneğimizde ise struct kullanımına bir örnek daha vermiş olacağız... Dosya açma, kapatma, silme gibi temel işlemleri struct üzerinden yapacağımız gibi, aynı zamanda struct içerisinde metodları kullanacağız... 

1 - Öncelikle okul adında aşağıdaki veritabanımızı hazırlıyoruz... Bu veritabanını daha önce defalarca kullandık...










2 - Form tasarımımız sol taraftaki gibi olacaktır... Program çalıştığında da sağ taraftaki gibi olacaktır...

3 - Database komutlarımız için using kısmında oledb tanımlamasını yapınız...

4 - Veritaban adında bir tane struct tanımlaması yapınız... 4-9 arasındaki maddelerde yazan bütün komutları struct içerisinde yapacaksınız...  baglanti ve komut adında iki tane public erişim türünde değişkenimizi tanımlayınız... baglanti oledbconnection, komut oledbcommand sınıf türünde olacaktır... 

5 - Structımızın ilk metodu olarak ac adında veritabanını çağıracağımız ve açacağımız bir metod tanımlayacağız... Bu metodu string bir parametre alacak şekilde tanımlayınız... Bağlantıları kullandığınız değişkenlere göre ayarlanacak şekilde aşağıdaki gibi yapabilirsiniz...

baglanti = new OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source="+veritabanadi+".mdb");
komut  = new OleDbCommand();
baglanti.Open();

Burada daha önce kullanmadığımız bir işlem yapıyoruz... Parametre ile gelen değişkenimizin içerisinde veritabanı dosyasının adını veriyoruz ve bunu veritabanıadı parametre değişkeni ile çağırıyoruz... Bu şu anlama geliyor... Farklı veritabanı dosyalarımızı da çağırabiliriz...  

6 - Bağlantıları ac adında bir metod ile struct içerisinde açtığımız gibi kapat adında bir metod ile de kapatacağız... Aşağıdaki metodu struct içerisinde yazınız...
public void kapat()
            {
                baglanti.Close();
            }

7 - Veritabanından silmek istediğimiz kişiler için bilgisil adında bir metodu struct içerisinde hazırlayacağız... Bunun için yine bir string parametre tanımlayacağız ve bu parametreye sorguyu göndereceğiz... Bu metodun içeriği aşağıdaki gibi olacaktır... Yalnız metodun  parametre değişkenini, commandTexte atamayı unutmayın...

komut.Connection = baglanti;
komut.CommandText = // Buraya parametre değişkenini yazınız...
komut.ExecuteNonQuery();


8 - Aşağıdaki metod tanımlamasını yapınız... Bu metod bize girdiğimiz isme karşılık diğer bilgilerini verdirecek... 
public void bilgiver ( string sorgu, string gelenisim, ListBox gelenlist)
            {

            }

Bu tanımlamada önemli bir kısım vardır... O da ListBox gelenlist parametre tanımlamasıdır... Daha önce böyle bir tanımlama yapmamıştık... Metodların, Classların, Structların içerisinde C# nesnelerini direkt adları ile kullanamıyoruz... Bir metodun içerisinde listbox1.items.add yazmaya çalıştığınızda hata verecektir... Çünkü bunlar ana programın parçalarıdır ve bu kısımlar da kullanılmalarına izin verilmemektedir... Ama kullanmak istediğimiz elemanı kendi sınıfında parametre olarak tanımladıktan sonra istediğimiz gibi kullanabiliyoruz... Burada Form1 de kullanmış olduğumuz listbox1 i istediğimiz gibi çağırıp kullanabileceğiz... gelenlist aslında bizim listbox1 nesnemiz olacaktır... 

9 - bilgiver metodumuzun içerisinde girilen ismi arattırıp veritabanından gelen isimler ile kıyaslayacağız... Eğer isim var ise gelenlist adındaki listbox parametremize ekleyeceğiz... Bu sayede ismin bilgileri listbox1 in içerisinde gözükmüş olacaktır...  Bunu daha önceki örneklerimizde defalarca yaptık... Yinede aşağıdakine benzer bir örnek ile işlemimizi yapabiliriz... 

komut.CommandText = // Buraya veritabanını sorgulayacak olan parametreyi yazın; 
komut.Connection = baglanti;
OleDbDataReader oku = komut.ExecuteReader();
while (oku.Read())
{
         if (// Buraya gelenisim ile veritabanındaki ismi kıyaslayacak komutu yazınız...)
        {  
               // gelenisim veritabanında var ise buraya listboxa eklenecek bilgileri sırası ile ekleyin...
               // ad, soyad, yas, numara bilgileri sırası ile eklensin...

        }
}
oku.Close();


10 - Structımızın içeriği bu metodla beraber bitmiş oldu... Şimdi sıra ara ve sil butonlarımızın içeriğini hazırlamakta... Bunun içinde ilk olarak ara butonumuzu hazırlayacağız... Veritaban adındaki structımızı bir değişken ile çağıralım... 
Örneğin veritaban veri = new veritaban();

11 - Veritabanımızı açmak için aşağıdaki komutu kullanalım... Benim veritabanı dosyamın adı okul olduğu için aşağıdaki komut ile bağlantıları açıyorum... 
veri.ac("okul");

12 - Aşağıdaki sorguyu bilgiver adındaki struct metoduna gönderelim... bilgiver isimli metoda 3 tane parametre tanımlamıştık... 
* Select * From ogrenci sorgusu ilk parametre olacaktır... 
* İsmi girdiğimiz textbox ikinci parametre olacaktır... İsmi büyük harfler ile gönderelim ki küçük - büyük harf karışımı olmasın...
* listbox1 de üçüncü parametremiz olacaktır... 

13 - Aşağıdaki komut ile de veritabanımızı kapatalım...
veri.kapat();

14 - Sil butonumuzu hazırlayalım... 10, 11 ve 13. maddelerdeki komutlar aynen bu buton içinde geçerli olacaktır... Yalnız 12. maddedeki gibi sorgumuzu göndermemiz gerekecektir... Bunun içinde textboxa girilen ismi silecek olan bir sorgu gönderiniz... 

15 - Uygulama bu işlem ile birlikte bitmiştir... Sizde bu uygulamaya veri ekleyecek ve veri düzenleyecek bir çalışma yapınız... 

31 Aralık 2013 Salı

Veritabanı Ders Uygulamaları - 10... Struct Kullanımı...

1 - isyeri adında aşağıdaki veritabanını oluşturun... 
Bu veritabanı için sadece yas alanını sayı olarak tanımlayınız... 

2 - Aşağıdaki gibi form sayfası oluşturunuz... 

3 - Program çalıştığı zaman aşağıdaki gibi bir sonuç verecektir... Bu sonucu struct kullanmadan da yapabiliriz ama struct bize performans açısından artı sağlamaktadır... Struct ile ilgili genel bilgi almak için tıklayınız...













4 - Kod kısmına geçelim... Veritabanı komutlarını kullanabilmek için Data.OleDb sınıfını çağıralım...

5 - isyeri adındaki veritabanımızı çağıralım... oledbconnection sınıfını kullanarak baglanti adında bir değişken tanımlayalım...

6 - Sql sorgulaması yaptırabilmek için komut adında oledbcommand sınıfına ait bir değişken tanımlayalım...

7 - Bir tane struct tanımlayalım... ad,soyad,sehir,yas,ulke adında değişkenler tanımlayalım...
Struct tanımlanırken aşağıdakine benzer bir örnek kullanılabilir... Bu yapı her yerde kullanılabilecek şekilde tanımlanmalıdır...
Struct agac
{
          public string yaprak;
          public string govde;
          public int meyvesayisi;
}

8 - Program açıldığın da listboxın içeriğini doldurabilmek için Form Load da komutları yazıyoruz...

9 - Veritabanı bağlantısını açıyoruz...

10 - Veritabanından bütün bilgileri, oku adında  oledbdatareader sınıfından tanımladığımız değişkene getiriyoruz...

11 - Bir while döngüsü ile oku değişkenimiz içindeki verileri okutuyoruz...
While (oku.Read) 
{
            // işlemler
}

12 - Bu while döngüsünün içerisinde işlemler kısmında öncelikle bir değişken tanımlayacağız... Bu değişken struct yapısını çağıracak ve onun özelliklerini kullanacaktır... 
Örneğin yukarıdaki struct için Agac govde = new Agac(); şeklinde tanımlanabilir...

13 - Oku değişkenimize almış olduğumuz bilgileri sırası ile structta tanımlamış olduğumuz değişkenlere atayacağız... 
Örneğin govde.yaprak = oku[0].ToString();  gibi...

14 - Yine bu while döngüsü içerisinde atamış olduğumuz değişkenleri listboxa ekliyoruz...
Örneğin listBox1.Items.Add(govde); gibi...

15 - Veritabanı bağlantısını kapatıyoruz... 

16 - Aşağıdaki metodu struct içerisine yazarak ToString metodunu eziyoruz... Çünkü struct a bilgiler alınırken nesne olarak alınıyor ve veritabanındaki bütün veriler ekleniyor... Bu durumda yazdırabilmek için metodu bir daha tanımlıyoruz... Çünkü sadece listbox içerisinde adları görmek istiyoruz...
public override string ToString()
            {
                return Ad; // listboxda etiketlenirken sadece Ad alanı ile etiketleniyorlar... 
            }

17 - Listboxda seçilenleri görmek için listboxın selectedindexchanged olayını kodlayacağız... 

18 - Seçili olan elemana ait verileri getirebilmek için aşağıdaki kodu listboxın içerisine yazıyoruz...
Agac secilinesne = (Agac)listBox1.SelectedItem;

19 - Labellarımıza sırası ile seçili olan nesnemizin değerlerini aktarıyoruz... 
label1.Text = secilinesne.yaprak;

Programımızı çalıştırıyoruz... Bu örnek ile struct yapısının neden kullanılması gerektiğini de öğrenmiş oluyoruz...
* Performans açısından avantajlı...
* Veritabanını sürekli olarak aç kapa yapmak zorunda değiliz...
* Struct ile tanımladığımız nesneleri istediğimiz gibi kullanabiliyoruz...  

Veritabanı Ders Uygulamaları - 3


30 Aralık 2013 Pazartesi

1 - Struct - Giriş...


Modülde ki teorik anlatımı ile struct yapısı aşağıdaki gibidir...
Nesne tabanlı programlama beş veri tipini destekler. Bunlar Class, Struct, Enum, Interface ve Delegate tipleridir. Bu öğrenme faaliyetinde Yapı (struct) veri tipini ele alacağız.

Aralarında mantıksal bir ilişki bulunan ama farklı türdeki verilerin bir arada bulunması gereken durumlarla karşılaşılabilir. İşte bu durumlarda belli bir grup verinin bir arada tutulması için oluşturulan yeni birime yapı (struct) denir.

Yapılar değer türündedir. Dolayısıyla belleğin yığın (stack) bölümünde tutulurlar.

Bellek kullanım bakımından yığın (stack) ve öbek (heap) olmak üzere ikiye ayrılır.

Yığın bölümünde veriler üst üste gelecek şekilde depolanırlar. Yeni bir veri eklendiğinde bu belleğin en üst bölgesine yerleştirilir. LIFO (Last In First Out) mantığına göre çalışır. Yani son giren ilk çıkar. Verilere erişim basit olduğu için hızlıdır.

Öbek kısmında ise boş bir alan oluşturulur ve veriler rastgele yerleştirilir. Verilere erişim karmaşık olduğundan daha yavaştır.

Değer türleri belleğin yığın (stack) bölümünde tutulurken; referans türler belleğin öbek (heap) bölümünde tutulur. Örneğin sınıflar(class) referans türünde olduklarından dolayı belleğin öbek (heap) bölümünde tutulur.

Yapıları tanımlamak için ‘struct’ anahtar sözcüğünü kullanırız. Bir yapının genel tanımlanma şekli aşağıdaki gibidir.
struct yapi-ismi
{
    yapi-elemanlari-listesi;
}

Genel tanımdan sonra söylenebilecek olan durum şudur... Structlar çok yoğun bir şekilde işlemciyi veya belleği yoracak olan durumlarda kullanılır... Çünkü kullanıldıktan sonra bellekten silinir... Böyle olunca sistemi yormaz... Onun dışında aslında classlardan her hangi bir farklılıkları yoktur... Hatta class kullananlar için struct kullanımı performans istemiyorsa gerekmektedir... 

Aşağıda basit bir örnek yapılmıştır... Bu örnek normalde struct kullanılmadan da rahatlıkla yapılabilir... Veri girişi için giris adında bir adet struct tanımlanmıştır... Structların içerisinde değişkenler tanımlanabildiği gibi metodlarda tanımlanabilir... 

Giris structın da tanımlanan goster adındaki metoda gelen bilgiler ekranda sonuc olarak gösterilmektedir... Structı çağırmak için yeni nesne tanımlaması kullanılmalıdır... 

giris gondermesaj = new giris();

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        struct giris
        {
            // Tanımlama sırasında public erişim seçeneği kullanılarak her yerden ulaşılması sağlanmaktadır... 
            public string goster(int no, string ad, string soyad, int yas)
            {
                string mesaj = "Numarası = " + no + "... Adı = " + ad + "... Soyadı = " + soyad + "... Yaşı =  " + yas + "..."; 
                return mesaj; // Structan geri dönecek olan bilgidir... 
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            giris gondermesaj = new giris(); // Bir nesneyi çağırır gibi gondermesaj adında bir tanımlama yapıyoruz... 
            MessageBox.Show(gondermesaj.goster(int.Parse(textBox1.Text), textBox2.Text, textBox3.Text,    int.Parse(textBox4.Text))); // Bilgiler içerisinde sayı olanlar structa, int.parse ile gönderilmektedir...
        }
    }
}

Yine aynı şekilde yapılmış olan aşağıdaki örnekte ise struc içerisinde değişkenler tanımlanmıştır... Bu yapı içerisindeki değişkenlerde sırası ile çağrılmıştır... Bu kullanıma bakılırsa daha çok değişkenlerin karmaşasını ortadan kaldıran bir yapıdadır...

struct ogrenci
        {
            public string ad; // Her yerde kullanılması için Public tanımlama yapılmıştır... 
            public string soyad;
            public string sınıf;
            public int no;
          }
        ogrenci ogren = new ogrenci(); // ogren adında structı kullanacak yapı tanımlanıyor...
        private void Form1_Load(object sender, EventArgs e)
        {
            ogren.ad = "ibrahim"; // Structa bilgiler gönderiliyor...
            ogren.soyad = "delibalta";
            ogren.sınıf = "2-c";
            ogren.no = Convert.ToInt16("1453");
        }
        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Add(ogren.ad);// Structa gönderilen bilgiler listboxda gösteriliyor...
            listBox1.Items.Add(ogren.soyad);
            listBox1.Items.Add(ogren.sınıf);
            listBox1.Items.Add(ogren.no);
        }