Kaynak: Bilgehan YILDIZ
Merhaba Arkadaşlar,Bu makalemde sizlere Linq Üstünde Stored
Procedure kullanımı Anlatacağım.
Öncellikle Linq da Bir DataContext Oluşturulduğunu ve
oluşturulan bu contextin içine veritabanımızdaki tablolarımızın süreklenip
bırakıldığını söylemiştim(Bkn Linq Giriş-1 Makalesine).
1-)Öncelikle DataContextimizi oluşturuyoruz.Daha Sonra
Veritabanında oluşturduğumuz Stored Proceduremüzü sürükleyip contextimizin
içine bıraktığımız zaman (aşağıdaki şekilde altı kırmızı ile çizili) stored
proceduremüz bir DataFunction olarak sistemimize eklenecektir.
Örnek olarak SQL Server da SP_KisiEkle isimli bir stored
procedure oluşturulalım.Ve oluşturduğumuz bu procedurü contextimizin içine
sürükleyelim.
Create
PROCEDURE [dbo].[SP_KisiEkle]
(
@Ad nvarchar(50),
@Soyad nvarchar(50),
@Cinsiyet bit,
@DogumTarih nvarchar(11)
)
AS
Begin
Insert Into Kisi(Ad,Soyad,Cinsiyet,DogumTarih) VALUES (@Ad,@Soyad,@Cinsiyet,@DogumTarih)
End
2-)Daha Sonra Formumuzda bir Kişi Ekleme Buttonunun
Click Eventine aşağıdaki kodu yazalım.Nasıl bir contextte ctx.TabloAdı diyip
işlem yapabiliyorsak benzer şekilde burada ctx.StoredProcedureAdı verip işlem
yapabiliyoruz.
DataClassesDataContext ctx = new DataClassesDataContext();
ctx.SP_KisiEkle(txtAd.Text,txtSoyad.Text,Convert.ToBoolean(txtCinsiyet.Text),
txtDogumTarih.Text);
ctx.SubmitChanges();
3-) 2 nolu şıkta kullandığımız örnekteki stored procedure
içine sadece in parametrelerini alıyordu.Peki biz output parametresinide
kullanmak istersek,örnek olarak biz yaşı girdiğimiz zaman çıkış olarak bize o
yaşın altındaki kişilerin maaş toplamlarını getiren bir procedure oluşturalım
ve bunu da contextimize sürükleyelim.
Create
PROCEDURE [dbo].[SP_YasaGoreMaasToplam]
(
@Yas int,
@Toplam money
OUTPUT
)
AS
Select
@Toplam=Sum(Maas) From CalisanDetay where
Yas<@Yas
return @Toplam
Proceduremüzü oluşturduktan sonra kod tarafında ise bir
butonun click eventine aşağıdaki kodumuzu yazalım burada dikkat edilmesi
gereken hususlar output parametresini stored
procedure yazarken ref anahtar kelimesini
kullandık.
Ayrıca decimal? para=0; şeklinde soru işareti ile tanımlama
yaptık.Buradaki soru işaretinin anlamı biz onu veritabanında boş olabilecek
şekilde tanımlamış olduğumuzu belirtmektedir.Yani veritabanında nullable
kolonlar için soru işaretli tanımlama yapmamız gerekmektedir.
protected void btnHesapla_Click(object
sender, EventArgs e)
{
int? yas=Convert.ToInt32(txtYas.Text);
decimal? para=0;
DataClassesDataContext
ctx = new DataClassesDataContext();
lblTotal.Text= ctx.SP_YasaGoreMaasToplam(yas,ref para).ToString();
}
4-)Son olarak da eğer Stored
Procedurümüzden bir liste dönecekse,Örnek olarak procedurümüz ile
KisiTablomuzdaki tüm kayıtları çekelim.
Create PROCEDURE SP_KisileriGetir
AS
BEGIN
Select * From Kisi
END
Kod Tarafında ise Stored proceduremüzden gelen kayıtları bir
listboxa yazdıralım.(Kayıtların sadece isim kısımlarını aldım).
protected void btnKisiGoster_Click(object
sender, EventArgs e)
{
DataClassesDataContext
ctx = new DataClassesDataContext();
List<SP_KisileriGetirResult> k
=ctx.SP_KisileriGetir().ToList();
foreach
(var i in k)
{
lstKisiler.Items.Add(i.Ad.ToString());
}
}