Bazı noktalarda, işimizi kolaylaştıran stored procedure’leri uygulamalarımıza dahil etme ihtiaycı hissedebiliriz. SqlDataAdapter ile nasıl yapıldığını şuradan inceleyebilirsiniz. Şimdi de bu işlemi Entity Framework ile nasıl yapacağımızı inceleyeceğiz. Örnek uygulamamızda AdventureWorks veri tabanını kullanacağız.

SQL tarafında bir stored procedure oluşturarak örneğimize başlayalım. Yapacağı iş, bölgelerin adlarını ve toplam satış miktarlarını göstermek olsun.

CREATE PROC USERSP_BolgelereGoreSatis

AS  

      SELECT SST.Name[Bölge Adı], SUM(SOD.LineTotal) [Toplam Satış] FROM Sales.SalesOrderDetail SOD

      JOIN Sales.SalesOrderHeader SOH ON SOD.SalesOrderID=SOH.SalesOrderID

      JOIN Sales.SalesTerritory SST ON SST.TerritoryID=SOH.TerritoryID

      GROUP BY SST.Name

image

Bir windows form uygulaması açalım ve formumuza bir DataGridView kontrolü ile bir button ekleyelim. Amacımız, butona basıldığında grid içerisine procedure’den gelen sonuçları doldurmak olsun.

image

Procedure’ümüzü uygulamamıza dahil edebilmek için projemize sağ tuş tıklayarak, add new item >> ADO.NET Entity Data Model ekleyelim ve ilgili procedure’ü seçerek işlemi tamamlayalım. Modelin eklenmesi sırasındaki adımların detaylarını şuradan inceleyebilirsiniz.

image

Procedure’ü modelimize ekledikten sonra bir metot gibi kullanabilmemiz için “Function Import” seçeneğinden ilgili düzenlemeleri yapmamız gerekir. Burada, metodun ismini ve en önemlisi, geriye döndürdüğü tipi belirtme şansına sahibiz.

Modelimizi ekledikten sonra karşımıza çıkan edmx uzantılı pencerede boş bir yere sağ tuş tıklayarak Model Browser’ı seçelim.

image

Sağ tarafta açılan küçük pencerede, Stored Procedures altında, eklemiş olduğumuz procedure’ü bularak sağ tuş tıklayalım ve “Add function Import”u seçelim.

image

Karşımıza çıkan pencerede ilgili procedure’ün hangi isim ile metotlaştırılacağı ve geriye dönüş tipinin ne olacağı bilgileri yer almaktadır. Elde edeceğimiz sonuç kümesinde bölge isimleri ve toplam satış miktarları mevcut idi. Yani string ve decimal tipinde iki kolon elde edeceğiz. Ekranda görülen “Get Column Information” butonuna tıklayarak, visual studio’dan yardım alabilir, geriye dönen sonuç kümesinde hangi tiplerin mevcut olduğunu görebiliriz.

image

Normal şartlarda bu metodu karşılayacak bir tip tasarlamamız, içerisine de string ve decimal tipinde iki property eklememiz gerekir. Ancak Entity Framework bizim için bu tipi otomatik olarak oluşturmaktadır. “Create New Complex Type” butonuna tıklayalım ve bu tipin oluşmasını sağlayalım.

image

Ok butonuna bastıktan sonra USERSP_BolgelereGoreSatis_Result adında bir tip otomatik olarak oluşturulacak ve içerisine 2 adet property eklenecektir. Bunu da Model Browser penceresinde ve designer içerisinde görmemiz mümkündür.

image

image

Artık procedure kullanılmaya hazır hale geldi. Uygulamamız içerisinde “USERSP_BolgelereGoreSatis” isimli, parametre almayan ve geriye ObjectResult<USERSP_BolgelereGoreSatis> tipinden bir sonuç döndüren metodumuz mevcut. Şimdi de butona basıldığında procedure’ü çalıştırarak grid içerisinde sonuç kümesini görüntüleyelim.

namespace EntityFrameworkSPCagirmak

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            AdventureWorksEntities context = new AdventureWorksEntities();

            dataGridView1.DataSource = context.USERSP_BolgelereGoreSatis();

        }

    }

}

Alacağımız ekran çıktısı aşağıdaki gibi olacaktır.

image



5 yorum:

Adsız dedi ki...

ellerine sağlık teşekkürler

Merve dedi ki...

İyi akşamlar dediklerinizi aynen yaptım fakat AdventureModelDiagram.designer.cs dosyanızda oluşan fonksyionlar bende oluşmadı içi boş benim designer classım neyden kaynaklanıyor olabilir?

Onur Salkaya dedi ki...

Merhaba Merve Hanım,

Dikkat ederseniz benim oluşturduğum örnekte de diagram boş durumda. Diagramın dolu ya da boş olması sizin veri tabanınızdan hangi nesneleri eklediğiniz ile alakalıdır.

Boş olan diagramda (yani edmx uzantılı fiziksel dosya) sağ tuş tıklayıp "Update from Database" seçeneği ile "Add" menüsünden procedure'u eklemeniz gerekir. Sonrasında da diğer adımları takip ediniz.

Merve dedi ki...

Merhabalar öncelikle yanıt verdiğiniz için çok teşekkür ederim,
ben öncelikle projeme sağ tıklayıp add>new ıtem>data>ADO.NET.Entity Data Modelden modelimi oluşturdum daha sonra Sql serverda oluşturduğum tabloları ve storeprocedurleri seçip ekledim .Model browserda Stored procedurs/functions seçeneğinin altında procedürlerim gözüküyor function importsun altındada fonksyionları mesela usp_ElbiseGetir_Result şeklinde fonksyion oluşturmuş.Ama designer.cs uzantılı dosyanın içi boş procedürlerim ve tablolarımın içi dolu olmasına rağmen.Ayrıca diğer bir sorun
ben şimdi bu store procedurleri projemde çağırmak istiyorum ElbiseControllerında ShoppingEntities db = new ShoppingEntities();
dediğimde ShoppingEntities nesnesinin altını çiziyor ama böyle bir nesne var sebebi ne olabilir ya da store procedurler controllerın içerisinde nasıl çağırılır birkaç sitede ..Entities db=new ...Entities?
int sonuc=db.procedürismi().Single(); şeklinde ama ben dediğim gibi Entities kısmında altı çizili çıkıyor yani tanımıyor üstte using projeismi.Models dediğimde de Modelsın altını çiziyor yardımcı olur musunuz?

Unknown dedi ki...

merhaba iyi geceler. Benim bir Sorum olucaktı. Şimdi bı proje ile uğrasıyorumda bir bolumde tıkandım. ve bu anlattıgınız cozumlerle gıderılecek gibi duruyor ama nasıl uygulayacagımı bılemedım. anlatmak gerekırse formda iki listviev var ve ıkı buton var soldakı list vievde ogrenciler tablom var butonlarımda geldi ve cıktı . soldaki listvievdeki ogrencilerimin derse geldiğinde yoklama alır gıbı geldi butonuna basıyorum sag taraftakı listvievime geciriyor buraya kadar sıkıntı yok hallettım sorunsuz calısıyor fakat burdan sonra soyle bı durum daha olmasını ıstıyorum. geldi butonuna basıp sagdaki listvieve geçirirken sql select sorgusu kullanıyorum ki ogrenci tablosunun biligilerini getirsin diye. tamda bu esnada yanı sagdaki listvieve geçirdiğim anda saat kaçta geldiğinide ( gec mi geldi şekilde hesaplatıyorum ders saatı 9 ise kac dakkıka geciktiğini hesaplatıyorum fakat bu hesaplattıgım veriyi(butona basıldıgında hesaplanıyorya) aynı buton ıcınde bu gecıkma dakkıkasını vt de ilgili tabloya nasıl eklicem. bı butonda nasıl ıkı sql sorgusunu yedircem bu durumda yardımcı olbilirmisiniz. acık bı sekılde yol gosterirmisiniz.

Yorum Gönder