Execute Stored Procedure with Astoria
Posting ini akan mendokumentasikan cara menjalankan stored procedure dengan menggunakan Astoria. Akan dibahas beberapa kasus stored procedure yang ada, agar kita mempunyai pengetahuan trik saat bertemu salah satu kasus tersebut.
{Simple Stored Procedure & ADO.NET Entity Data Model}
Sebelumnya akan coba dibuat 1 stored procedure baru di dalam database Northwind.
USE [Northwind]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GetEmployees]
AS
BEGIN
SET NOCOUNT ON;
SELECT * from Employees
END
Store procedure di atas hanya akan melakukan select ke tabel Employees.
Setelah Web Site dipersiapkan dan item akan template ADO.NET Entity Data Model dibuat, maka saat proses memilihan database object, pilih tabel Employees dan GetEmployees pada bagian Stored Procedures.
Kalau diperhatikan pada Model Brower (yang lokasinya berdampingan dengan Solution Explorer) dapat dilihat hasil seperti berikut ini.
Klik kanan pada GetEmployees dan pilih Create Function Import.
Cek Entities dan pilih Employees.
Selanjutnya tambahkan item baru dari template ADO.NET Data Service. Agar stored procedure dapat dipanggil via Astoria, maka perlu ditambahkan method baru yang dapat dilihat kodenya dari baris ke-19 sampai ke-24.
1: using System;
2: using System.Data.Services;
3: using System.Collections.Generic;
4: using System.Linq;
5: using System.ServiceModel.Web;
6: using NorthwindModel;
7:
8: public class WebDataService : DataService< NorthwindEntities >
9: {
10: // This method is called only once to initialize service-wide policies.
11: public static void InitializeService(IDataServiceConfiguration config)
12: {
13: // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
14: // Examples:
15: config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
16: config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
17: }
18:
19: [WebGet]
20: public List<Employees> GetEmployees()
21: {
22: NorthwindEntities ent = new NorthwindEntities();
23: return ent.GetEmployees().ToList();
24: }
25: }
Selanjutnya method tadi dapat dipanggil dengan cara seperti berikut ini.
Kasus kedua ada dibuat stored procedure yang mempunyai parameter seperti berikut ini.
USE [Northwind]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[GetEmployeesByCountry]
@Country NVARCHAR(15)
AS
BEGIN
SET NOCOUNT ON;
SELECT * from Employees
WHERE Country = @Country
END
Selanjutnya lakukan penambahan stored procedure ini ke dalam model, caranya buka file *.edmx yang telah dibuat dan pilih tab Model Browser. Klik kanan pada pada area Model Browser dan pilih Update Model from Database. Setelah itu centang GetEmployeesByCountry.
Setelah itu hasilnya dapat dilihat pada Model Browser.
Kita juga dapat melihat parameter yang dimiliki oleh stored procedure di atas. Selanjutnya klik kanan pada GetEmployeesByCountry dan pilih Create Function Import, seperti yang telah dilakukan sebelumnya di atas.
Langkah terakhir adalah menambahkan method seperti dibawah ini.
[WebGet]
public List<Employees> GetEmployeesByCountry(string country)
{
NorthwindEntities ent = new NorthwindEntities();
return ent.GetEmployeesByCountry(country).ToList();
}
Dan untuk mencari data employee yang nilai field Country=USA, maka dapat dilakukan dengan cara menulis url berikut pada address bar.
http://localhost:58977/WebSite8/WebDataService.svc/GetEmployeesByCountry?country='USA'
Penggunaan List sebagai tipe keluaran method GetEmployees dan GetEmployeesByCountry dapat diganti dengan ObjectResult setelah menambahkan namespace System.Data.Objects pada blok using.
using System.Data.Objects;
.
.
.
[WebGet]
public ObjectResult<Employees> GetEmployees()
{
NorthwindEntities ent = new NorthwindEntities();
return ent.GetEmployees();
}
[WebGet]
public ObjectResult<Employees> GetEmployeesByCountry(string country)
{
NorthwindEntities ent = new NorthwindEntities();
return ent.GetEmployeesByCountry(country);
}
Pada dua kasus di atas, menggunakan return type yang sesuai dengan struktur tabel yang sudah ada (pada contoh di atas return type adalah Entities dengan nilai Employees). Bagaimana bila stored procedure mempunyai output non-entity, sebagai contoh output dari stored procedure adalah jumlah pegawai berdasarkan negara yang dipilih. Berikut adalah contoh stored procedure yang akan digunakan.
USE [Northwind]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SumEmployeesByCountry]
@Country NVARCHAR(15)
AS
BEGIN
SELECT COUNT(EmployeeID) as SumEmployees from Employees
WHERE Country = @Country
END
Lakukan hal yang sama seperti di atas untuk menambahkan stored procedure yang dimaksud ke dalam model.
Saat proses Create Function Import, pilih opsi seperti berikut.

Hmmm… … ternyata trik memanggil fungsi-fungsi yang mengembalikan nilai non-entity belum saya temukan :) Ada beberapa trik yang bisa digunakan tetapi masih belum dimengerti, sehingga untuk sementara cara untuk memanggil fungsi tipe ini pada Astoria akan ditunda dulu, dan akan didokumentasikan pada posting berikutnya.
{Custom WebGet Method}
Bagi yang tidak terbiasa dengan stored procedure, maka kita dapat membuat custom method langsung pada (misalnya) WebDataService.cs dengan memanfaatkan LINQ untuk ‘meng-query’ entity yang ada pada Entity Data Model.
Langkah pertama adalah buat WebGet method. Kemudian di dalam method tersebut buat instan dari class entity (misal NorthwindEntities), setelah itu lakukan penggunaan LINQ seperti contoh di bawah ini.
1: [WebGet]
2: public List<Employees> SelectEmp()
3: {
4: NorthwindEntities ent = new NorthwindEntities();
5: var query = ent.Employees.Select(p => p);
6: return query.ToList();
7: }
Pada contoh di atas, dapat dilihat method dengan nama SelectEmp, artinya kita dapat memanggil method itu pada address bar di web browser seperti ini.
Contoh-contoh lain yang merupakan implementasi LINQ pada method yang bisa ditambahkan pada Astoria adalah seperti contoh di bawah ini.
1: [WebGet]
2: public List<Employees> SelectEmp()
3: {
4: NorthwindEntities ent = new NorthwindEntities();
5: var query = ent.Employees.Select(p => p);
6: return query.ToList();
7: }
8:
9: [WebGet]
10: public int SumEmp()
11: {
12: NorthwindEntities ent = new NorthwindEntities();
13: var query = from p in ent.Employees select p;
14: return query.Count();
15: }
Sekian dokumentasi kali ini, posting berikutnya merupakan dokumentasi lanjutan eksekusi stored procedure.