Merhaba, bu yazıda sizlere C# programlama dilinde MySql’i kullanarak login (giriş yap) formu ve kayıt olma formu tasarlayıp, kodlarını inceleyeceğiz. Daha önce hiç C# ile MySql kullanmadıysanız önceki yazıma bakmanızı tavsiye ederim.
Öncelikle projemizi açıyoruz ve projemize referans ekleden MySql.Data kütüphanesini ekliyoruz. (Nasıl ekleneceğini bilmiyorsanız buraya tıklayın.) Daha sonra formumuza 3 adet label (biri mavi renkli label olan lblKaydol), 2 adet textBox (txtKullaniciAdi, txtSifre) ve 1 buton (btnGirisYap) ekliyoruz.
Alttaki resimlerde formun görünümü ve veritabanımdaki tablonun görünümü mevcut.
Eğer şifre yazarken gözükmemesini istiyorsak, txtSifre textboxımızın özelliklerinden (properties) PasswordChar özelliğine yıldız (*) işaretini yazarak bunu sağlayabilirsiniz.
Altta projenin tüm kodlarını inceleyip bir yandan da kendiniz yazarak daha akılda kalıcı bir şekilde öğrenebilirsiniz. Neredeyse tüm kodların açıklamaları kod satırlarına mevcuttur.
using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient; //Projenize bu kodu eklemeyi unutmayın
namespace logindemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// Veritabanı bağlantısı için server bilgilerinin tutulduğu global bir nesne oluşturdum ve içine bilgilerimi girdim
public static MySqlConnection baglanti = new MySqlConnection("Server=localhost; Database=test_veritabani; Uid=root; Pwd=;");
public static void veritabani_baglantisi() // Veritabanı bağlantısını açmak için ayrı bir metot oluşturdum
{
try // Bağlantıda sorun oluşması durumunda hatanın ne olduğunu öğrenebilmek için try-catch kullandım
{
baglanti.Open();
}
catch (Exception err)
{
MessageBox.Show(err.Message); //Bağlantıyı açarken hata oluşursa, ayrıntılı bir şekilde bunu görebileyim
}
}
bool giris_dogrulama(string kAdi, string sifre) //Girişi doğrulamak için ayrı bir metot oluşturdum, geriye bool tipi değer döndürecek
{
veritabani_baglantisi(); //veritabani_baglantisi metotunu çağırarak veritabanına bağlantıyı açtım
MySqlCommand cmd = new MySqlCommand(); //Veritabanına göndereceğim sorguyu tutabilmesi için nesne oluşturdum
//NOT: MySqlCommand veritabanı üzerinde sorgulama, ekleme, güncelleme, silme işlemlerini yapmak için kullanılır
cmd.CommandText = "SELECT * FROM giris_bilgileri WHERE kullanici_adi=@kAdi AND sifre=@sifre"; //Nesnenin içine sorgumu yazdım
cmd.Parameters.AddWithValue("@kAdi", kAdi); //textboxlara girilen değerleri, parametrelere aktardım
cmd.Parameters.AddWithValue("@sifre", sifre); //Not: Parametre kullanarak injection'a karşı önlem alıyorum
cmd.Connection = baglanti; //Komutu veritabanına yolladım
MySqlDataReader login = cmd.ExecuteReader(); //MySqlDataReader'ı, yolladığım komuttan dönen değerleri satır satır okuması için kullandım
if (login.Read()) //Read metodu geriye bool türünde değer döndürür
{
baglanti.Close();
return true; //Okunacak satır var ise true değer döndürür
}
else
{
baglanti.Close();
return false; // Okunacak değer yoksa da false değeri döndürür
}
}
private void btnGirisYap_Click(object sender, EventArgs e) //Giriş Yap butonuna tıkladığımda çalışacak kodları yazdım
{
string kAdi = txtKullaniciAdi.Text; //textboxtaki değerleri string değişkenlere atadım
string sifre = txtSifre.Text;
if (kAdi == "" || sifre == "") //Eğer textboxlardan biri boşsa beni uyarsın ve işlem yapmasın
{
MessageBox.Show("Lütfen tüm alanları doldurun");
return;
}
bool a = giris_dogrulama(kAdi, sifre); //giris_dogrulama metotuna giriş bilgilerini yolladım ve bool tipinde bir değer elde ettim
if (a) //Dönen değer true ise yani bilgiler veritabanındaki kayıtlarda mevcutsa if kod bloğu çalışsın
{
MessageBox.Show("Giriş Doğrulandı.");
//Not: Bu if bloğuna giriş doğrulandığında gerçekleşmisini istediğiniz kodları yazabilirsiniz
}
else //Dönen değer true değilse yani false ise bu kod bloğu çalışsın
MessageBox.Show("Hatalı Kullanıcı Adı veya Şifre!");
}
private void lblKaydol_Click(object sender, EventArgs e) //Kaydolmak için mavi renkli labele tıklandığında
{
this.Hide(); //Bu formu gizleyip, arkaplanda bekletsin
Form2 f2 = new Form2(); //Form2'den bir kopya oluştursun ve
f2.Show(); //Bunu ekranda göstersin, yani kaydolma ekranına geçiş yapsın
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
/*Uygulamadan çıkmak istediğinizde diğer forma eğer daha önce geçiş yapmışsanız o gizlenmiştir (hide) ve arka planda çalışıyodur.
* Formu kapatma eventine uygulamadan tamamen çıkma metotunu ekledim.*/
}
}
}
Bu kısmı Form1 için yazdıktan sonra, şimdi de projemize sağ tıklayıp yeni bir form ekleyelim.
Formumuza 3 adet label, 3 adet textbox (txtYeniKullanici, txtSifre, txtSifreTekrar), 2 adet buton (btnGeriDon, btnKaydol) ekleyelim ve resimdeki gibi düzenleyelim.
Oluşturduğumuz yeni forma alttaki kodları yazalım.
using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace logindemo
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void btnKaydol_Click(object sender, EventArgs e)
{
string yeniKullanici = txtYeniKullanici.Text;
string sifre = txtSifre.Text;
string sifreTekrar = txtSifreTekrar.Text;
bool od = on_dogrulama(yeniKullanici, sifre, sifreTekrar); //ön doğrulamamı gerçekleştirdim ve değerini od değişkenine atadım
if (od) //eğer od true ise kayıt işlemini gerçekleştirsin
{
Form1.veritabani_baglantisi();// Form1'de oluşturduğum metodu kullanarak bağlantımı açtım
MySqlCommand cmd = new MySqlCommand(); //Veritabanına göndereceğim sorguyu tutabilmesi için nesne oluşturdum
cmd.CommandText = "INSERT INTO giris_bilgileri(kullanici_adi, sifre) values(@ykullanici, @sifre)"; //Nesnenin içine sorgumu yazdım
cmd.Parameters.AddWithValue("@ykullanici", yeniKullanici);
cmd.Parameters.AddWithValue("@sifre", sifre); //textboxlara girilen değerleri, parametrelere aktardım
cmd.Connection = Form1.baglanti; //Form1'deki public static tanımladığım ve tekrar yazmak zorunda kalmadığım veritabanı bağlantımı kullanarak sorgumu yolladım
int etki = cmd.ExecuteNonQuery(); //Etkilenen kayıt sayısını "etki" değişkenine atadım
if (etki != 0) //Eğer kayıt eklendiyse, degisken sıfırdan farklı olacaktır ki o halde kayıt başarılıdır
{
MessageBox.Show("Kayıt başarılı!");
}
else
MessageBox.Show("Kayıt başarısız!");
Form1.baglanti.Close(); //En son kullanmadığım için bağlantımı kapadım
}
}
bool on_dogrulama(string yk, string s, string st) //Ön doğrulama işlemini gerçekleştirmek için metot oluşturdum
{
if (yk == "" || s == "" || st == "") //Eğer herhangi bir textbox boşsa false değeri döndürsün
{
MessageBox.Show("Lütfen tüm alanları doldurun");
return false;
}
if (s != st) //şifre ve tekrarı aynı değilse false değeri döndürsün
{
MessageBox.Show("Girdiğiniz şifre ve tekrarı birbiriyle uyuşmuyor!");
return false;
}
else //İstenmiyen durumlardan biriyle karşılaşılmazsa true değeri döndürsün
return true;
}
private void btnGeriDon_Click(object sender, EventArgs e)
{
/*Eğer giriş yapma ekranına bu şekilde dönmek isterseniz, döndüğünüz ve gizlediğiniz(hide ile) o pencere eski pencere
* olmayacaktır. Bunu textboxlar içine değer girdikten sonra, geçiş yaparak deneyebilirsiniz. Mutlaka o yazdıklarınız silinmiş
* olacaktır.*/
this.Hide(); //Formu arkaplanda çalışması için gizledim
Form1 f1 = new Form1(); //Form1'in kopyasını oluşturup
f1.Show(); //Ekranda göster dedim
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit(); //Aynı şekilde diğer formdaki gibi bu formunda kapanma olayına uygulumadan çıkış metotunu ekledim
}
}
}
Projenizi çalıştırın ve test edin. Eğer bir problemle karşılaşırsanız veya sorunuz olursa yorumlara bunu yazmaktan çekinmeyin. İyi forumlar.