ASP.NET ile yapacağımız web sitelerinde, internette neredeyse her web sitesinde gördüğümüz ve kullanıcılardan bilgi almak, bu bilgileri veritabanına kaydetmek için kulanılan kayıt(Register) sayfalarını stabil bir şekilde geliştirebiliriz. Burada stabil olarak tanımlamamın nedeni yardımcı(helper) fonksiyonların ve EventHandler denilen sayfada kullanıcı tarafından yaratılan olayların(Örneğin bir butona tıklanması) kodlarının ayrı ayrı ve düzenli bir şekilde yazılabilmesidir.
Uygulama sayfamız kodlamayı bitirdikten sonra genel olarak aşağıdaki gibi gözükecektir. Sayfadaki kontroller Label(
Durum... yazan yerde bir Label kontrolü bulunmaktadır.), Button, DropDownList olmak üzere genel kontrollerdir. Dizaynın kolay olması için
Table tagından yararlandım.
Belki kullanıcıdan istenen bilgiler yeterli olmayabilir; ama konunun özünü kavramak için iyi bir örnek sayılır. Veritabanına da kayıt gerçekleştireceğimiz için artık kodlama kısmına geçelim. Sayfayı ilk açtığımızda karşımıza her zamanki
Page_Load metodu çıkar. Buradan sonra kendi kodlamalarımıza geçelim. C# Nesne tabanlı bir dil olduğunda dolayı Nesne Tabanlı dillerin bütün özelliklerini kullanarak her yerde kullanabileceğimiz bir
Register(Kayıt) kontrolü yapabiliriz. Şimdilik orta düzeyde ve geliştirilebilir bir kayıt sayfası bize yeter.
Arka planda sayfada girilen bilgilerin tutulacağı bir kullanıcı tablosu oluşturmak gereklidir. Bunun için SQL kodlarını yazıp SQL Query Analyser biçiminde bir programla kullanıcı tablosunu veritabanına ekleyebilriz. Fakat ben kullanım kolaylığı açısından
Sql Server Management Studio Express kulandım. Kullanımı çok kolaydır. Burada yaptığım kullanıcılar tablosunun diyagramını görüyoruz.Burada tek kafayı karıştırabilecek olan bölüm RoleID ve SehirID sutunlarıdır. Bu sutunlar Roller ve Sehirler tablolarına bağlanırlar. Sehirler tahmin edilebileceği gibi sadece şehirleri sıralayan bir tablodur. Roller tablosunda ise; üç tane rol bulunmaktadır. Bunlar Yönetici, Kullanıcı, Ziyaretçi sütunlarıdır. Biz burada SQL kodu ile kullanıcı eklerken direkt olarak ID'yi 2 vereceğiz.
Sayfanın en üstündeki import edilen namespace'ler aşağıda görülmektedir.
1: using System;
2: using System.Data;
3: using System.Configuration;
4: using System.Collections;
5: using System.Web;
6: using System.Web.Security;
7: using System.Web.UI;
8: using System.Web.UI.WebControls;
9: using System.Web.UI.WebControls.WebParts;
10: using System.Web.UI.HtmlControls;
11: using System.Data.SqlClient
Visual Studio'yu açtığımızda zaten bu kodların çoğu otomatik olarak gelmektedir. Ben bunlardan sadece using System.Data.SqlClient; satırını ekledim. Veritabanına kaydederken bu namespace'te bulunan class'lardan yararlanacağız.
1: public partial class Default2 : System.Web.UI.Page
2: {
3: public struct Kullanici
4: {
5: public string adSoyad;
6: public string Email;
7: public string kullaniciAdi;
8: public int sehirID;
9: public string sifre;
10: public string kullaniciID;
11: }
Bu kodu yazarken neredeyse her programlama dilinde bulunan Struct Data yapısını kullandım. Bu bize sayfadaki kullanıcının girdiği değerleri kolayca alıp bir yerde tutmamızı sağlar. Bunun yerine Kullanici Class'ı açıp Nesne tabanlı programlamaya daha uygun hareket edebilirdik; fakat şimdilik bu yapı yeterli. Ayrıca bu yapıyı kullanarak veritabanı ile kolayca ilişki kurabiliriz. Burada dikkati çeken başka bir olay da değişkenlerin public olarak tanımlanmasıdır. Eğer Struct yapısındaki değişkenlere diğer metodlardan ulaşmak istiyorsak; değişkenler public olarak tanımlanmalıdır.
1: Kullanici structKullanici;
2: private bool SetValues()
3: {
4: bool deger = false;
5: try
6: {
7: structKullanici = new Kullanici();
8: structKullanici.adSoyad = txtAdSoyad.Text;
9: structKullanici.Email = txtEmail.Text;
10: structKullanici.kullaniciAdi = txtKullaniciAdi.Text;
11: structKullanici.sehirID = Convert.ToInt32(ddlSehirler.SelectedValue);
12: structKullanici.sifre = txtSifre.Text;
13: deger = true;
14: }
15: catch
16: {
17: deger = false;
18: }
19: return deger;
20: }
Burada kullanıcıdan aldığımız bilgileri yarattığımız struct yapısının özelliklerine gönderiyoruz. Bu yapı Nesne Tabanlı programlama ile daha önce uğraşanlara çok tanıdık gelir. Hatta kullanılan (.) nokta notasyonu aynen Objelerle uğraşıyormuşuz gibi gelir. Burada yazdığımız metod önemli bir iş daha yapmaktadır. Bu iş kullanıcıdan gelen değerlerin Struct yapısındaki değişkenlere atanıp atanmadığının da kontrölünü yapar. Bu yüzden metodun boolean(1/0) değer dönmesinin daha yararlı olacağını düşündüm.
1: private SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS; Integrated Security=True; Initial Catalog=QuizWebSite");
2: private void KullaniciKaydet(Kullanici kullanici)
3: {
4: string sorgu = "INSERT INTO Kullanicilar " +
5: "(KullaniciAdi, Sifre, KayitTarih, RoleID, AdSoyad, Email, SehirID) " +
6: "VALUES " +
7: "(@KullaniciAdi, @Sifre, GETDATE(),2, @AdSoyad, @Email, @SehirID )";
8: SqlCommand cmd = new SqlCommand(sorgu, conn);
9: // Parametreleri ekle
10: cmd.Parameters.AddWithValue("@KullaniciAdi", kullanici.kullaniciAdi);
11: cmd.Parameters.AddWithValue("@Sifre", kullanici.sifre);
12: cmd.Parameters.AddWithValue("@Email", kullanici.Email);
13: cmd.Parameters.AddWithValue("@SehirID", kullanici.sehirID);
14: cmd.Parameters.AddWithValue("@AdSoyad", kullanici.adSoyad);
15: // parametrelerin eklenmesi bitti
16: if (conn.State == ConnectionState.Closed)
17: {
18: conn.Open();
19: }
20: int id = cmd.ExecuteNonQuery();
21: // Bellek temizleme
22: cmd.Parameters.Clear();
23: conn.Close();
24: if (id > 0)
25: {
26: lblMesaj.Text = "Eklenen kullanıcı kayıt id= " + id;
27: }
28: else
29: {
30: lblMesaj.Text = "Hata";
31: }
32: }
Burada ise; veritabanı bağlantısı kurulup (sqlconnection) bağlantı üzerinden sqlcommand objesi ile sorgu uygulanır. Bu method Struct'ı parametre alır, böylece kolayca struct'ın değişkeni üzerinden kullanıcının girilen bilgileri gönderilip, veritabanına kullanıcının bilgileri eklenebilir. Command objesini parametrelerinin oluşturulması da tamamen SQL Sorgusu ile senkron olarak yapılmalıdır. Aynı parametre isimleri verilmelidir. Aksi takdirde hata ile karşılaşırız. Belirtilmesi gereken başka bir nokta da sqlconnection objesinin aldığı string parametredir. Bu parametreye Connection String adı verilir. Bu veriler uygulamanın veritabanı işlemlerini yaparken kullandığı bilgileri bulundurur.
1: protected void Page_Load(object sender, EventArgs e)
2: {
3:
4: }
5: protected void btnGonder_Click(object sender, EventArgs e)
6: {
7: if (SetValues())
8: {
9: KullaniciKaydet(structKullanici);
10: }
11: }
12: } // Class kapandı
Son kod bloğunda ise; tamamen ektiğimizi biçme durumu vardır. Bu kısa kodun arkasında az önce yazdığımız metodlar asıl işi yapar. Gönder butonunun click eventi'ini buton üzerinde (Design Görünümünde iken) çift tıklayarak gelmesini sağlarız. Önceikle kullanıcıdan alınan değerlerin Data yapımız olan Struct'a atanmasını sağlarız. Daha sonra ise kaydetme metodumuzu kullanarak işlemi tamamlarız.
Notlar
- Bu şekilde kullanıcıdan istediğimiz bilgiyi alıp rahat bir şekilde üzerinde veritabanı işlemleri uygulayabiliriz.
- Bellek yönetimini kod içinde genelde veritabanı işlemleri gerçekleştirirken yapmalıyız. Aksi takdirde SQL Server boşu boşuna bağlantıyı açık tutmuş olur.
- Connection String çok önemli bir konudur. Burada sadece kısa bir şekilde bahsedilmiştir. Tam olarak öğrenilmesi veritabanı işlemlerini doğru yapmak için önemlidir. Buradan daha geniş bilgiye ulaşılabilir. Ayrıca burada belirtilen Data Source kısmında belirtilen (.) işareti sizde çalışmaz ise; Bilgisayar_adı\Sql_Server_Adı şeklinde deneyin.
- T-SQL Dili, eğer .NET veritabanı uygulamaları yazılmak isteniyorsa; öğrenilmesi gereken veritabanı programlama dilidir.