Makale Özeti

Bu makalemde ASP.NET uygulamasında GridView & DetailsView kontrollerinin kullanımı, bu kontrollerde ItemTemplate kullanımı ve MsSQL Server Stored Procedure'lerini kullanarak veri bütünlüğünün sağlanması konularına değineceğim.

Makale

Burda veri girişinde veya güncelleme işleminde bir zorluk yaşanmaktadır.Meslekler tablomuzda meslek bilgilerimiz mevcuttur, fakat kisiler tablosunu güncellerken meslek alanında textbox  kontrolü kullanılmaktadır.Bütün meslekleri aklımızda tutamayız veya yanlış bir meslek kaydı girebiliriz.Bu sorunu aşmak için GridView ItemTemplate'lerini değiştirmemiz gerekmektedir.

GridView kontrolü akıllı etiketini kullanarak 'Edit Columns' link'ini tıklayın.

Karşınıza Fields penceresi çıkacaktır.Burda 'Selected fields' çerçevesinden meslek kolonunu seçin ve 'Convert this field into a TemplateField' link'ini tıklayın.

Meslek alanı artık bir templateField haline gelmiştir.Ok butonuna tıklayın ve GridView kontrolü akıllı etiketinden Edit Templates link'ini tıklayın.

'Template Editing Mode' akıllı etiketinde Display bölümünde 'Column[3] Meslek' seçeneğini seçin.

EditItemTemplate bölümünde textbox kontrolü göreceksiniz.Bu kontrol edit işleminde bizim kullandığımız kontroldür.

Bu kontrolü seçip silin.Ardından ToolBox'dan bir dropDownList kontrolü seçiğ EditItemTemplate bölümüne ekleyin.

Kontrol'e datasource olarak meslekler tablosundan veri okumasi için eklediğimiz SqlDataSource2 kontrolünü atayın.

DropDownList kontrolünün edit anında, edit edilen meslek kolonunun değerini alması için kontrolün akıllı etiketinden 'Edit DataBindings' link'ini tıklayın.

DataBindings penceresinde DropDownList kontrolünün SelectedValue özelliğini meslek alanına bind edin.

Projemizi çalılştırıp test ettiğimizde, GridView kontrolünde herhangi bir satırı edit ettiğimizde meslek kolonunda eklediğimiz DropDownList kontrolünün görüntülendiğini göreceksiniz.

Şimdi forma yeni veri girişi için bir DetailsView kontrolü ekleyin, datasource özelliğini SqlDataSource1 olarak ayarlayın ve akıllı etikette 'Enable inserting' seçeneğini seçili hale getirin.GridView kontrolünde yaptığımız gibi EditFields link'ini kullanarak DetailsView kontrolünde EditItemTemplate kısmındaki textbox kontrolünü dropDownList kontrolü ile değiştirin.Varsayılan olarak DetailsView kontrolü veri kaynağından gelecek ilk kaydı gösterecektir.DetailsView kontrolünü veri girişi için kullanacağımızdan dolayı kontrolün DefaultMode özelliğini Insert olarak ayarlayın.

Evet artık yeni kişi kaydı girebilecek durumdayız.Projemizi test edelim.

Projemizi bitirdiğimize göre artık MsSQL Server Stored Procuedure'lerini kullanarak veri bütünlüğünün nasıl sağlanacağını işleyelim.Senaryomuzu göz önünde bulundurarak veri bütünlüğü nedir açıklamaya çalışalım.Yeni bir kişi kaydı girdiğimizi düşünelim.Biz kişi kaydını girerken network'te başka bir kullanıcının seçtiğimiz meslek kaydını sildiğini düşünün.Kişi kaydında bir sorun yaşanmayacaktır fakat seçtiğimiz meslek kaydı meslekler tablosunda artık olmadığından dolayı veri bütünlüğü kuralı kırılmış olacaktır.Projenin diğer bölümlerinde meslekler'e göre istatistik aldığımızı düşünürsek kişi tablosundaki bir kişi açıkta kalacaktır.Bunu engellemek için MsSQL server stored procedure'lerini kullanalim.İlk önce SqlDataSource kontrolünü güncelleme ve ekleme işlemi için Stored Proc'u kullanacak şekilde güncellememiz gerekecektir.

Yarattığımız veritabanına yeni bir Stored Procedure ekleyin.

Aşağıdaki t-SQL kodunu yazın ve saklayın.

 AjandaX veritabanı SP_KISI_SAVE sp t-SQL kodu
CREATE PROCEDURE dbo.SP_KISI_SAVE
	@id			int,
	@isim		varchar(50),
	@soyisim	varchar(50),
	@meslek		varchar(50)
AS
	if not exists(select meslek from meslekler where meslek=@meslek)
		begin
			raiserror('Girilen meslek kaydı mevcut değildir.',16,1)
			return
		end
	
	if isnull(@id,0)=0
		begin
			insert kisiler values(@isim,@soyisim,@meslek)
		end
	else
		begin
			update kisiler set
				isim=@isim,
				soyisim=@soyisim,
				meslek=@meslek
			where
				id=@id
		end

SP'miz hazır olduğuna göre artık SqlDataSource'umzu SP_KISI_SAVE'i çağıracak şekilde güncelleyelim.SqlDataSource akıllı etiketinden 'configure data source' seçeneğini seçin.Karşımıza çıkan pencerede 'Specify custom SQL statement or Stored Procedure' seçeneğini seçip next'e tıklayın.

Update ve Insert sekmelerinde SP_KISI_SAVE Stored Proc'unu seçin.

Finish butonuna tıkladığımızda artık güncelleme işlemleri SP_KISI_SAVE üzerinden gerçekleştirilecektir.
Şimdi SP kodunu inceleyelim.

if isnull(@id,0)=0
    begin
        insert kisiler values(@isim,@soyisim,@meslek)
    end
else
    begin
        update kisiler set
            isim=@isim,
            soyisim=@soyisim,
            meslek=@meslek
        where
            id=@id
    end


if isnull(@id,0)=0 
Satırı ile yeni bir kayıt mı giriliyor yoksa mevcut bir kayıt mı güncelleniyor, @id parametresinin aldığı değere göre bunu anlıyoruz.Eğer @id parametresi değeri 0 ise yeni bir kayıt giriliyor demektir.Eğer değer 0'dan büyükse mevcut bir kayıt güncelleniyor demektir.

if not exists(select meslek from meslekler where meslek=@meslek)
    begin
        raiserror('Girilen meslek kaydı mevcut değildir.',16,1)
        return
    end
Bu kod bloğu veri bütünlüğünün sağlandığı bloktur.Gönderilen kisi bilgileri kaydedilmeden hemen önce gönderilen meslek bilgisinin meslekler tablosunda mevcut olup olmadığı kontrol ediliyor ve eğer mevcut değilse kullanıcıya bir hata mesajı gönderiliyor ve işlem iptal ediliyor.Bu sayede veri bütünlüğü sağlanmış olmaktadır.Çalıştırıp test edelim.Yeni bir kayıt girişi bölümüne gelin ve Yazılım müh. meslek kaydını seçin.Insert link'ine tıklamadan önce Vs IDE'sine geri dönün ve meslekler tablsundan 'Yazılım müh.' kaydını silin.Internet explorer'a geri dönün ve insert link'ine tıklayın.

Gördüğünüz gibi 'Girilen meslek kaydı mevcut değildir' mesajını alacaksınız.Böylece veri bütünlüğünü sp üzerinde sağlamış oluyoruz ve silinen bir meslek kaydının kişiler tablosuna eklenmesini engellemiş oluyoruz.

Evet bir makalenin daha sonuna geldik.Umarım yararlı olmuştur.
Hepinize mutlu günler dilerim. 

Levent YILDIZ
theone@leventyildiz.net
msmoracle@hotmail.com 
http://www.leventyildiz.net