SQL Server ve MySQL Server Destekli Yazılım Geliştirme

Kurumsal olarak geliştirilen yazılımların özelliklerine bakıldığında hemen hemen hepsinde en az iki veri tabanı sistemini desteklediği belirtilmiştir. Bu özellik ilk bakışta her ne kadar geliştirilmesi zor bir özellik olarak görünse de aslında sadece temel kalıtım özellikleri kullanılarak geliştirilebilir. Bu yazımızda biz de herhangi bir harici kütüphane kullanmadan bu işlemi nasıl yaptığımızı inceleyeceğiz.

Bu işle için öncelikle uygulamamızın destekleyeceği veri tabanı sistemlerinde eş yapılı bir veri tabanı yapısı kurulur. Biz örneğimizi tek tablo üzerinden götüreceğiz.

MySQL Tablo Yapısı:

CREATE TABLE `kisiler` (
  `id` int NOT NULL AUTO_INCREMENT,
  `isim` varchar(100) NOT NULL,
  `soyisim` varchar(100) NOT NULL,
  `telefon` char(10) NOT NULL,
  PRIMARY KEY (`id`)
) 

SQL Server Tablo Yapısı

CREATE TABLE Kisiler2(
Id int PRIMARY KEY IDENTITY(1,1) NOT NULL,
Isim nvarchar(100) NOT NULL,
Soyisim nvarchar(100) NOT NULL,
Telefon char(10) NOT NULL
)

Veri tabanı yönetim sistemi üzerinde tablolar oluşturulduktan sonra bu tablolara karşılık gelen C# sınıfları yazılır. Bu sınıfların yazılasının sebebi veri tabanı yönetim sistemlerimiz ile uygulamamızı ortak bir yapı altında konuşturabilmektir.

Tablolara Karşılık C# Sınıfı

 class Kisi
    {
        public int Id { get; set; }
        public string Isim { get; set; }
        public string Soyisim { get; set; }
        public string Telefon { get; set; }
    }

Sınıfımızı da oluşturduktan sonra artık veri tabanı işlemleri için yapımızı kurmaya başlayabiliriz. Yapımızın temelinde interface (ara yüz) kavramı olduğundan burada interface kavramına değinmek lazım.

Interface

Interface tanımlanırken herhangi bir sınıf tanımlanır gibi tanımlanır ancak türüne class yerine interface yazılır.

Interface içerisinde neler bulunabilir neler bulunamaz:

  • Interface içerisinde propertyler bulunabilir.
  • Interface içerisinde tanımlanan metotların sadece başlık bildirimi yapılır, gövdesi tanımlanmaz.
  • Interface içerisinde tanımlanan property ve metotlar public olduğundan ayrıca erişim belirteci belirtilmez.

Bu bilgilerden sonra şimdi tanımlanan tablomuz üzerinde yapılacak olan işlemlerin metotlarını barındıran bir interface tanımlayalım.

interface IKisi
{
   int KisiEkle(Kisi yeniKisi);
   List<Kisi> KisileriGetir();
}

İncelememizi iki metot üzerinden ilerleteceğiz. Tanımlanan interface içerisinde de göründüğü üzere metotların sadece başlık bilgileri girilmiş ancak gövdeleri tanımlanmamış. Gövdeleri yani bu metotların yapacakları işleri bu interfaceden türetilen sınıflar yapacak.

Interface tanımı da yaptığımıza göre şimdi de sıra SQL Server ve MySQL Server işlemlerini yapacak sınıfları tanımlamaya.

SQL Server Veri Tabanı İşlemleri

    class MsSqlKisiIslemleri : IKisi
    {
        public int KisiEkle(Kisi yeniKisi)
        {
            SqlConnection sqlConnection = new SqlConnection("Data Source=.\\egitim;Initial Catalog=OgretmenBilgi;Integrated Security=True");
            SqlCommand sqlCommand = new SqlCommand("INSERT INTO Kisiler([Isim], [Soyisim], [Telefon]) values(@i, @s, @t)", sqlConnection);

            sqlCommand.Parameters.AddWithValue("@i", yeniKisi.Isim);
            sqlCommand.Parameters.AddWithValue("@s", yeniKisi.Soyisim);
            sqlCommand.Parameters.AddWithValue("@t", yeniKisi.Telefon);


            sqlConnection.Open();
            int i = sqlCommand.ExecuteNonQuery();
            sqlConnection.Close();

            return i;
        }

        public List<Kisi> KisileriGetir()
        {
            List<Kisi> kisiler  = new List<Kisi>();
            SqlConnection sqlConnection = new SqlConnection("Data Source=.\\egitim;Initial Catalog=OgretmenBilgi;Integrated Security=True");
            SqlCommand sqlCommand = new SqlCommand("select Id, Isim, Soyisim, Telefon from Kisiler", sqlConnection);
            
            sqlConnection.Open();
            SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();

            while (sqlDataReader.Read())
            {
                Kisi kisi = new Kisi();
                kisi.Id = sqlDataReader.GetInt32(0);
                kisi.Isim = sqlDataReader.GetString(1);
                kisi.Soyisim = sqlDataReader.GetString(2);
                kisi.Telefon = sqlDataReader.GetString(3);
                kisiler.Add(kisi);
            }


            sqlConnection.Close();
            return kisiler;
        }
    }

MySQL Server Veri Tabanı İşlemleri

    class MySqlKisiIslemleri : IKisi
    {
        public int KisiEkle(Kisi yeniKisi)
        {
            MySqlConnection sqlConnection = new MySqlConnection("server=localhost;user id=root;database=egitim;pwd=123456qaZ.");
            MySqlCommand sqlCommand = new MySqlCommand("INSERT INTO Kisiler(isim, soyisim, telefon) values(@i, @s, @t)", sqlConnection);

            sqlCommand.Parameters.AddWithValue("@i", yeniKisi.Isim);
            sqlCommand.Parameters.AddWithValue("@s", yeniKisi.Soyisim);
            sqlCommand.Parameters.AddWithValue("@t", yeniKisi.Telefon);


            sqlConnection.Open();
            int i = sqlCommand.ExecuteNonQuery();
            sqlConnection.Close();

            return i;
        }

        public List<Kisi> KisileriGetir()
        {
            List<Kisi> kisiler = new List<Kisi>();
            MySqlConnection sqlConnection = new MySqlConnection("server=localhost;user id=root;database=egitim;pwd=123456qaZ.");
            MySqlCommand sqlCommand = new MySqlCommand("select id, isim, soyisim, telefon from Kisiler", sqlConnection);

            sqlConnection.Open();
            MySqlDataReader sqlDataReader = sqlCommand.ExecuteReader();

            while (sqlDataReader.Read())
            {
                Kisi kisi = new Kisi();
                kisi.Id = sqlDataReader.GetInt32(0);
                kisi.Isim = sqlDataReader.GetString(1);
                kisi.Soyisim = sqlDataReader.GetString(2);
                kisi.Telefon = sqlDataReader.GetString(3);
                kisiler.Add(kisi);
            }


            sqlConnection.Close();
            return kisiler;
        }
    }

İlgili işlem sınıflarımızı da tanımladıktan sonra şimdi de aralarında ki benzerlik ve farklılıklarına göz atalım.

Benzerlikler:

  • Her iki sınıf da IKisi interfacesinden türetilmiştir ve interface özelliği gereği aynı metot tanımlarını barındırırlar
  • Metotların aldıkları parametre türleri ve dönüş türleri aynıdır.

Farklılıklar:

  • Metotların gövdelerinde yer alan veri tabanı işlemleri sınıfların sorumlu oldukları veri tabanı sisteminin kodlarıdır.

Ve geldik son işleme: Hem SQL Server hem MySQL Server için gerekli sınıflar ve kodlar yazıldığına göre uygulamamızda ilgili veri tabanı yönetim sistemine nasıl ulaşacağız?

Öncelikle uygulamamızın hangi veri tabanı sisteminde çalışacağını bir sistem parametresi olarak kaydetmek gerekiyor. Bu kayıt işlemi Properties -> Settings altında veya app.config içerinde olabilir. Yazımız içerisinde bu parametreye “dbType” ismini vereceğiz.

İlk işlemimizi olan kişi ekleme metodunu çağırmak için gerekli kodları yazalım.

IKisi iKisi = null;

if (dbType == SQLServer)
{
    iKisi = new MsSqlKisiIslemleri();
}

else if(dbType == MySQL)
{
    iKisi = new MySqlKisiIslemleri();
}

Kisi kisi = new Kisi
{
    Isim = textBoxAd.Text,
    Soyisim = textBoxSoyad.Text,
    Telefon = textBoxTelefon.Text
};

int kisiEkle = iKisi.KisiEkle(kisi);

Öncelikle veri tabanı türüne göre ilgili sınıfı barındıracak olan IKisi interfacesinden bir tanımlama yapıyoruz. Daha sonra dbType isimli sistem parametresinin değerine göre bu interfaceye ilgili sınıfın bir örneği atanıyor. Bu adımdan sonra metotlar interface üzerinden çağrıldığında artık kendisine atanan sınıfın içeriğini çalıştırır. Dolayısı ile bu adımdan sonra uygulamamız artık çoklu veri tabanı yönetim sistemi desteğine sahip olmuş oluyor.

Kodlamada son olarak kişileri listeleme işlemi metotlarını çağıralım.

 IKisi iKisi = null;

if (comboBoxDb.SelectedIndex == 0)
{
    iKisi = new MsSqlKisiIslemleri();
}

else if (comboBoxDb.SelectedIndex == 1)
     {
          iKisi = new MySqlKisiIslemleri();
      }

List<Kisi> kisiler = iKisi.KisileriGetir();

Kişi ekleme işleminde olduğu gibi burada da oluşturulan interface ve ona atanan sınıflar üzerinden işlemler yapılıyor.

Yazımızın sonucunu mini bir öz eleştiri ile kapatacak olursak; Eğitimlerde, okulda gördüğümüz her yeni bilginin muhakkak surette pratik hayatta profesyonel kullanımda nasıl kullanıldSQL Server ve MySQL Server Destekli Yazılım Geliştirmeığını sorgulayalım. Kendi adıma ilk olarak çoklu veri tabanı destekli yazılım geliştirme konusunu gördüğümde “çok zor bir işlem” demiştim ancak işlemi yaptığımda gördüm ki aslında çok iyi bildiğim bir konuymuş.

Hepinize bol ve bugsız bir kodlama yaşamı diliyorum 🙂




C# Form Çoklu Dil Desteği

Yerelleştirme diye tabir edilen uygulamanın birden çok dili desteklemesi, uygulamanın başarısını etkileyen faktörlerden biridir.

Aşağıdaki videomuzda C# form uygulamamıza çoklu dil desteğini nasıl sağlayacağımızı ve kullanıcının seçimine göre programın dilini ayarlayacağımızı işliyoruz.




C# Eklenti (Plugin) Destekli Yazılım Geliştirme

Yazılım geliştirilirken göz önünde bulundurulması gereken konulardan biri de uygulamanın geliştirilebilir olması ve bağımsız geliştiricilerin uygulamaya katkılarına destek sağlanması konusudur.

Bu tür uygulamalara en güzel örnekler internet tarayıcıların eklenti desteği ile vardıkları mükemmel özelliklerdir. C# dilinde de bu destek kolaylıkla, geliştirilen uygulamalara eklenebilir. Eklenti (Plugin) desteğinin uygulamaya nasıl eklendiğini öğrenmek için aşağıdaki videoya göz atabilirsiniz.




C# User Control Nedir ve Nasıl Oluşturulur

Windows form veya web form geliştirirken çoğu zaman .Net standart kütüphanesi ile gelen kontroller (buton, textbox vs.) yeterli olsa da özellikle projede geliştirilen sınıflara özgü görsel kontrol geliştirme gerekmektedir. Bu durumlarda User Control dediğimiz konu devreye girmektedir.

Örneğin bir sınav uygulaması geliştirilecek, bunun için en temel sınıfımız Soru sınıfı olacak. Soru sınıfına ait temel özellikle ise şunlar olacaktır.

  • Soru metni
  • Cevap şıkları (A,B,C,D,E)
  • Doğru cevap
  • Kullanıcının soruya verdiği cevap

Bu durumda 20 soruluk bir test için 20 tane metin alanı, 5 şıktan 20 soru için 100 radiobutton vs. kontrol eklenmesi gerekecektir. Tabi bütün bunları kontrol edecek kodlar. Bir sürü iş yani 🙂 Bütün bu kargaşa yerine yapılabilecek çözüm soru sınıfı için bir user control oluşturmak ve bir soru için gereken tasarımı yaptıktan ve ilgili kodları yazdıktan sonra her soru için bunu kullanmak.

Aşağıdaki videomuzda user controlun nasıl tanımlandığını ve kullanımı ile ilgili ayrıntılı bilgi bulabilirsiniz.




C# Forma Kısayol Ekleme

Yazılım geliştirilirken göz önünde bulundurulması gereken noktalardan biri de kullanıcı deneyimidir. Kullanıcı deneyiminde de ilk sırada efektif olarak oluşturulmuş kısa yollardır.

Form üzerinde kısayol tanımlanabilmesi için formun KeyPreview özelliğinin True olarak ayarlanmış olması gerekmektedir.

Bu özelliğin ayarlanmasından sonra forma ait KeyDown olayının (Event) ayarlanması gerekmektedir. Parametrede yer alan KeyEventArgs parametresi basılan tuşlara ait bilgileri tutmaktadır.

Örnek 1:

private void MyForm_KeyDown(object sender, KeyEventArgs e)
{
 if(e.Modifiers == Keys.Control && e.KeyCode == Keys.N)
 {
 // (Ctrl+N) tuşlarına basıldığında yapılması istenen işlemler
 }
}

Örnek 2:

private void MyForm_KeyDown(object sender, KeyEventArgs e)
{
 if (e.Control && e.Shift && e.KeyCode == Keys.O)
 {
 // Ctrl+Shft+O tuşlarına basıldığında yapılması istenen işlemler
 }
}

Aşağıdaki videodan konuyu daha ayrıntılı inceleyebilirsiniz.




C# Çoklu Form Uygulamaları ve Formlar Arası Veri Alış Verişi

Geliştirilen uygulamaların nerede ise tamamında birden fazla ekran kullanılmaktadır. Bu yazımızda birden fazla ekran içeren uygulamalarda ekranların beraber kullanılması ve ekranlar arası veri alış verişini inceleyeceğiz.

Bir ekranda iken ikinci bir ekranı açmak için iki metot bulunmaktadır. Bu metotlar ve açıklamaları;

  • [Form].Show() : Açılacak form açıldıktan sonra ana form kullanılmaya devam edilebilir şekilde açılır.
  • [Form].ShowDialog(): Açılacak form, açıldıktan sonra ana form kullanılamaz. Açılan form kapandıktan sonra ana form kullanılabilir. Kullanıcıya soru sorulacağı zaman çoğunlukla kullanılır. Bununla ilgili MessageBox yazımızı inceleyebilirsiniz.

İki metotta da öncelikle açılacak formu bir örneği oluşturulduktan sonra ihtiyaca göre Show veya ShowDialog metotları ile form açılır.

Form form1 = new Form1();
form1.Show();

Aşağıdaki videomuzda çoklu form uygulamaları ve formlar arası veri alış veriş yöntemlerini ayrıntılı şekilde bulabilirsiniz.




C# Console Komisyon Hesaplama

Bir komisyoncu sattığı mallardan fiyatı 50 TL kadar olanlardan %3, daha fazla olanlardan ise %2 komisyon almaktadır. Klavyeden girilen teker teker girilen 5 malın komisyonlarını bulup ekrana yazdıran ve en sonunda da toplam komisyonu ekrana yazdıran programını yazınız.

https://github.com/saitorhan/SizdenGelenler05




(C# Console, Diziler) Meteoroloji Sıcaklık Analizi

Meteoroloji merkezi için bir program tasarlanılması istenilmiştir. Programın çalışma şekli ise şöyle olmalıdır:

a. İlk önce hangi ay için sıcaklık bilgisi girileceği kullanıcıya sorulacaktır.

b. Girilen ay bilgisine uygun olarak o ayda kaç tane gün var ise kullanıcıdan gün sayısı kadar sıcaklık bilgisi girilmesi istenilecektir (şubat ayı için gün sayısını 28 alınız).

c. Sıcaklık veri girişi bittikten sonra o ayın sıcaklık ortalaması ve en düşük sıcaklık bilgisi ekrana yazdırılacaktır. Bu işlemden sonra program sonlanacaktır. Örnek Çıktı: Şubat Ayına ait Ortalama Sıcaklık=15,6 derecedir ve En düşük sıcaklık 6.Gün=10, 1 derecedir.

https://github.com/saitorhan/SizdenGelenler04




C# Console Toplama İşlemi Oyunu

Toplama işlemini öğretmeye çalışan bir oyun programı yazılacaktır. Oyun başladığı zaman rastgele 2 tane 1-100 arasında sayı tutulacak, tutulan sayılar ekrana gösterilecek ve kullanıcıya bu sayıların toplamı nedir diye sorulacaktı Eğer kullanıcı doğru cevap verirse “Tebrikler Bildiniz” Değil ise “Üzgünüm Bilemediniz” diye mesaj verecektir. Her cevaptan sonra “Tekrar Oynamak istiyormusunuz(e/E)?” şeklinde bir soru sorulacak ve eğer kullanıcı “e” veya “E” ile karşılık verirse oyun tekrar başlayacaktır. Kullanıcının puanı her doğru cevap için 5 puan artacak, her yanlış cevap için ise 2 puan azalacaktır. Oyun sonlandığında kullanıcının verdiği doğru cevap sayısı, yanlış cevap sayısı ve puanı ekranda listelenmelidir. Bu işlemleri yapan programın C# kodlarını yazınız.

https://github.com/saitorhan/SizdenGelenler03




C# Sayıyı Basamaklarına Ayırma

Klavyeden girilen herhangi bir sayıyı basamaklarına ayırıp her bir basamak değerini ve sayının kaç basamaklı olduğunu ekrana yazan C# programını yazın? Not: Hazır string ya da char fonksiyonlar kullanmayın. Girilen sayının basamak sayısı belli değildir. Her hangi bir sayı girildiğinde program doğru bir şekilde çalışmalıdır. Örneğin 123 girilmişse programın ekran çıktısı: 1 tane 100’luk, 2 tane 10’luk, 3 tane 1’lik; sayı 3 hanelidir şeklinde olmalıdır.

https://github.com/saitorhan/SizdenGelenler02