Reyza

tenang, senang, sederhana
See also: Other Geeks@INDC

Public

September 2009 - Posts

Catatan Singkat Tentang Astoria

Memang lebih enak memanggil Astoria dibandingkan ADO.NET Data Service, nama Astoria terdengar lebih sexy :)

Dalam beberapa bulan ini kebetulan sedang bekerja secara intens dengan Astoria. Karena kebanyakan hal yang dilakukan adalah hasil proses try-n-error (bukan hasil penelurusan dokumentasi dan konsep terlebih dahulu). Selama bekerja dengan Astoria ada beberapa yang menjadi catatan.

{Tipe Data pada Astoria}

Bila dimiliki tabel dengan field-field seperti berikut ini.

image

Maka apabila menggunakan LINQ to SQL, kita akan mendapati diagram seperti berikut.

Capture

Dari diagram di atas maka dapat dilihat bahwa:

  • tipe data dari property Sex adalah char.
  • tipe data dari property BirthHour adalah TimeSpan.

Apabila Astoria menggunakan class LINQ to SQL ini maka sudah dapat dipastikan ada di dapat error seperti berikut ini.

image

Hal ini disebabkan Astoria tidak men-support kedua tipe data tersebut. Apabila tetap ingin menggunakan class LINQ to SQL ini maka kedua property tersebut mesti diubah tipe datanya, yaitu :

  • Mengubah tipe data char menjadi string.
  • Mengubah tipe data TimeSpan menjadi DateTime.

Bila melirik ADO.NET Entity Data Model yang bisa dibilang sangat cocok bersanding dengan Astoria, maka dapat kita lihat bahwa tipe data yang cocok digunakan pada Astoria adalah sebagai berikut.

image

Share this post: | | | |
What the customer really needed

Mungkin ini adalah :

image

Mungkin ini sudah sering dilihat…tapi cuek saja, tetap di posting sebagai monumen bagi orang-orang yang berkutat di bidang software development.

image image

image image

image image

image image

image image

Share this post: | | | |
LINQ to SQL, Stored Procedure & Astoria

Pada posting sebelumnya,  saya terhenti saat ingin mengeksekusi function (hasil dari import stored procedure) yang mengembalikan nilai non-entity. Sepertinya harus membaca lebih banyak lagi tentang EDM dan Astoria. Bagi yang punya banyak pengalaman dengan EDM dan Astoria, silakan tinggalkan pencerahan pada komentar, untuk menunjukkan saya ke arah yang benar :)

Tapi kebutuhan akan perlukan mengeksekusi stored procedure yang sudah tersedia di database tetap harus diselesaikan. Oleh karena itu saya coba menggantikan EDMX dengan DBML milik LINQ to SQL.

Langkah sampai dapat memanggil stored procedure via web browser bisa dibilang singkat.  Setelah sebuah file DBML dibuat, dari Server Explorer, misal digunakan databae Northwind, browse bagian Stored Procedure dan pilih salah satu (atau semua) stored procedure yang ada kemudian drag-n-drop ke area Method Pane, seperti yang dilihat pada gambar.

image

Dan pada kode item ADO.NET Data Server (misal WebDataService.cs) dapat dibuat seperti berikut ini.

   1: using System;
   2: using System.Data.Services;
   3: using System.Collections.Generic;
   4: using System.Linq;
   5: using System.ServiceModel.Web;
   6: using System.Collections;
   7:  
   8: [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
   9: public class WebDataService : DataService< DataClassesDataContext >
  10: {
  11:     // This method is called only once to initialize service-wide policies.
  12:     public static void InitializeService(IDataServiceConfiguration config)
  13:     {
  14:         // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
  15:         // Examples:
  16:         config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
  17:         config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
  18:         config.UseVerboseErrors = true;
  19:     }
  20:  
  21:     [WebGet]
  22:     public List<Ten_Most_Expensive_ProductsResult> GetTopProducts()
  23:     {
  24:         DataClassesDataContext db = new DataClassesDataContext();
  25:         var query = db.Ten_Most_Expensive_Products();
  26:         return query.ToList();
  27:     }
  28: }

Pada baris ke-22 dapat dilihat bagaimana method untuk menjalankan stored procedure yang ‘sudah menjadi’ method pada DBML. Dapat dilihat terdapat ‘tipe data’ baru dengan nama Ten_Monst_Expensive_ProductResult. Selanjutkan kita dapat memanggil method Ten_Most_Expensive_Products setelah sebuah instan dari data context dibuat. Setelah itu tinggal panggil ‘url’ seperti berikut ini pada web browser.

image

Contoh yang lain, kita bisa memanggil stored procedure CustOrderHist dengan parameter CustomerID sebagai input. Setelah stored procedure di drag ke Method Pane, sekarang tinggal ditambahkan method seperti berikut ini.

[WebGet]
public List<CustOrderHistResult> CustOrderHist(string customerID)
{
    DataClassesDataContext db = new DataClassesDataContext();
    var query = db.CustOrderHist(customerID);
    return query.ToList();
}

Maka kita dapat memanggil method ini dengan cara berikut.

image

Posting selanjutnya akan didokumentasikan bagaimana mengkonsumsi ADO.NET Data Service dengan beberapa cara.

Share this post: | | | |
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.

image

Kalau diperhatikan pada Model Brower (yang lokasinya berdampingan dengan Solution Explorer) dapat dilihat hasil seperti berikut ini.

image

Klik kanan pada GetEmployees dan pilih Create Function Import.

image

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.

image

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.

image

Setelah itu hasilnya dapat dilihat pada Model Browser.

image

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.

image

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.

image

Saat proses Create Function Import, pilih opsi seperti berikut.

image

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.

image

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.

Share this post: | | | |
Menyiapkan IIS7 sebagai rumah Astoria

Agar Astoria betah dan dapat bekerja dengan nyaman dirumahnya (baca : IIS7), maka rumah tersebut harus memiliki semua fasilitas yang diperlukan oleh Astoria. Langkah-langkah untuk membuat rumah yang cocok untuk Astoria dikenal dengan 4M, yaitu : MENYIAPKAN, MEMASTIKAN, MENGUJI dan MENGABADIKAN.

{MENYIAPKAN}

Langkah ini adalah untuk menyiapkan hal-hal yang diperlukan Astoria pada IIS7. Pertama yang dilakukan adalah membuka jendela Turn Windows features on or off (Control Panel > Programs > Programs and Features > Turn Windows features on or off).

Web Managemen Tools

image

World Wide Web Services > Security

image

Microsoft .NET Framework 3.5.1

image

{MEMASTIKAN}

Setelah proses MENYIAPKAN sudah selesai, selanjutkan buka jendela IIS Manager, buat application dengan nama (misalnya) astoria.

image

Selanjutknya akses bagian Handler Mappings milik astoria.

image

Dan pastikan anda menemui seperti yang ada pada gambar di bawah ini.

image

Setelah semua hal-hal telah dipastikan, maka dapat dilanjutkan dengan ritual merestart layanan IIS.

{MENGUJI}

Untuk mengujinya tentu saja cukup dengan mencoba url berikut ini pada address bar di web browser.

image

Dantidak ada salahnya mencoba ‘query’ lainnya untuk pengujian.

{MENGABADIKAN}

Langkah ini yang sedang saya lakukan sekarang, yaitu mengabadikan dalam sebuah posting blog, agar saat suatu saat deploy ke server production, langkah-langkah ini kembali dapat saya ikut.

 

Posting selanjutnya akan membahas langkah-langkah yang harus dilakukan agar store procedure pada database dapat dieksekusi via Astoria. Setelah itu baru akan dibahas langkah yang harus dilakukan untuk menampilkan data yang ‘didapat’ dari Astoria ke data kontrol milik ASP.NET.

Share this post: | | | |
My First Touch on Astoria (ADO.NET Data Service)

Dibanding ADO.NET Data Service, lebih senang memanggil Astoria, biar terdengar lebih indah. Ceritanya lagi bertemu suatu kasus dimana seseorang mempunyai memiliki sebuah struktur database yang terdiri atas table(s), view(s) dan store procedure(s). Kemudian database tersebut akan disemanyamkan pada 4 sampai 5 lokasi yang berbeda, berbeda tempat, pasti berbeda server, ip address dan domain. Setelah itu akan dibangun 1 server yang akan berisi satu aplikasi web yang dapat digunakan sebagai ‘mesin pencari data’ keseluruh data pada setiap server tadi. Pencarian data ini berdasarkan keyword tertentu, dimana pada keyword tersebut terdapat kode yang akan menunjukkan lokasi dari server tempat data itu disimpan.

Misal terdapat kode berikut ini : SL5G-xxxxxxx, dimasukkan pada aplikasi web sang ‘mesin pencari data’, dari kode tersebut menyatakan bawah 5G adalah kode lokasi, sehingga sang aplikasi web akan meng-‘query’ ke server yang ditunjuk kemudian hasilnya akan ditampilkan pada aplikasi web.

Dari cerita itu maka dipikirkanlah cara yang paling sederhana untuk menyelesaikan permintaan tersebut, kalau perlu cuma dengan cara copy dan paste saja dari MSDN atau Technet :)

Dari menghayal beberapa teknologi yang ada, maka sampailah pada khayalan Astoria sebagai solusi termudah untuk permintaan tersebut. Dan berikut ini adalah cacatan selama bergelut dengan Astoria, sekedar sebagai dokumentasi atas apa yang telah dipelajari (red : rangkuman copy paste dari MSDN).

Database yang akan digunakan untuk uji coba ringan ini adalah database Northwind yang akan disemayamkan pada SQL Server 2008.

{Astoria & ADO.NET Entity Data Model}

Astoria dan ADO.NET Entity Data Model adalah pasangan yang paling sering digunakan (hal ini berdasarkan banyaknya posting blog tentang ini). Langkah-langkah bagian mana keduanya saling bekerja sama sampai dapat dinikmati pada web browser adalah sebagai berikut.

Pada VS2008, buat sebuah Web Site dan tambahkan item baru dari template ADO.NET Entity Data Model, dan (misalnya) beri nama Northwind.edmx.

image

Selanjutkan pilih Generate from database.

image

Setelah bertemu jendela seperti berikut, buat koneksi ke database Northwind (atau database lain yang diinginkan).

image

Jendela berikutnya akan meminta untuk memilih item-item mana saja yang akan diikutkan ke dalam model.

image

Setelah langkah tersebut selesai maka dapat dilihat pada Solution Explorer seperti berikut ini, terdapat file Northwind.edmx pada folder App_Code.

image

Selanjutnya tambahan item baru dari template ADO.NET Data Server pada Web Site, dengan nama (misalnya) WebDataService.svc.

image

Penambahan file WebDataService.svc akan secara otomatis menambahkan file WebDataService.cs pada folder App_Code dengan barisan kode seperti berikut :

   1: using System;
   2: using System.Data.Services;
   3: using System.Collections.Generic;
   4: using System.Linq;
   5: using System.ServiceModel.Web;
   6:  
   7: public class WebDataService : DataService< /* TODO: put your data source class name here */ >
   8: {
   9:     // This method is called only once to initialize service-wide policies.
  10:     public static void InitializeService(IDataServiceConfiguration config)
  11:     {
  12:         // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
  13:         // Examples:
  14:         // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
  15:         // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
  16:     }
  17: }

Agar WebDataService.svc dapat memberikan output yang diinginkan, maka perlu dilakukan penambahan dan modifikasi pada barisan kode di atas. Pertama dapat ditambahkan baris berikut ini pada baris ke-6.

using NorthwindModel;

NorthwindModel adalah namespace dari Northwind.edmx (Northwind.Designer.cs). Selanjutkanya ubah baris ke-7 menjadi seperti berikut ini :

public class WebDataService : DataService< NorthwindEntities >

Dan selanjutnya uncomment baris ke-14 dan ke-15, dan modifikasi seperti berikut ini, untuk memberikan hak akses pada resource yang ada pada data model.

config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);

Dengan langkah di atas maka WebDataService.svc sudah dapat di-‘view in browser’. Hasilnya dapa dilihat ‘daftar’ tabel dan view yang bisa di-‘query’ langsung dari address bar pada web browser.

image

Dan berikut hasilnya.

image

Bila suatu saat hanya ingin menampilkan data Customers dan Order saja, maka baris :

config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);

Dapat diganti menjadi seperti berikut ini :

config.SetEntitySetAccessRule("Customers", EntitySetRights.AllRead);
config.SetEntitySetAccessRule("Orders", EntitySetRights.AllRead);

Bila ingin menampilkan data dari tabel Customers, maka dapat dituliskan ‘query’ berikut ini pada address bar.

image

Sedangkan ‘query’ berikut ini berfungsi untuk menampilkan data Customer dengan nilai ANATR pada field primary key tabel Customers.

image

Sedangkan untuk menampilkan data Product yang nilai CategoryID=1 maka dapat digunakan ‘query’ seperti berikut ini.

image

Kumpulan ‘query’ lainnya akan dibalas lebih khusus pada posting berikutnya.

{Astoria & LINQ to SQL classes}

Pada bagian ini akan ditunjukkan hasil LINQ to SQL classes (*.dmbl) sebagai pengganti ADO.NET Entity Data Model.

image

Jadi pada Web Site yang baru, dapat ditambahkan item baru dengan tipe seperti di atas pada folder App_Code, dan beri nama Northwind.dbml.

image

Kemudian tambahkan koneksi ke database Northwind pada Server Explorer.

image

Kemudian seluruh tabel dan view yang ada pada Server Explorer dapat di drag-n-drop ke halaman designer dari Northwind.dbml (pada contoh ini, saya hanya menambahkan seluruh tabel saja).

Setelah menambahkan item baru dari template ADO.NET Data Service, maka file App_Code/WebDataService.cs akan dimodifikasi seperti berikut ini :

   1: using System;
   2: using System.Data.Services;
   3: using System.Collections.Generic;
   4: using System.Linq;
   5: using System.ServiceModel.Web;
   6:  
   7: public class WebDataService : DataService< NorthwindDataContext >
   8: {
   9:     // This method is called only once to initialize service-wide policies.
  10:     public static void InitializeService(IDataServiceConfiguration config)
  11:     {
  12:         // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
  13:         // Examples:
  14:         config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
  15:         config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
  16:     }
  17: }

Ada perbedaan pada baris ke-7 dari kode di atas dengan baris ke-7 pada bagian sebelumnya. Dan setelah WebDataService.svc di-‘view in browse’, maka dapat dilihat pesan seperti berikut :

image

Hm…tidak ada pesan error yang membantu kita. Untuk mendapatkan pesan error yang dapat lebih membantu kita maka dapat ditambahkan baris pada baris ke-7 dan baris ke-17, seperti yang dilihat pada barisan kode di bawah ini.

   1: using System;
   2: using System.Data.Services;
   3: using System.Collections.Generic;
   4: using System.Linq;
   5: using System.ServiceModel.Web;
   6:  
   7: [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
   8: public class WebDataService : DataService< NorthwindDataContext >
   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:         config.UseVerboseErrors = true;
  18:     }

Ups…tetap saja ada error, disinyalir ADO.NET Data Service kebingungan menentukan ‘primary key’ dari setiap ‘tabel’ yang ada di dalam model. Sebagai solusi kita dapat menambahkan baris dibawah ini pasa setiap class yang yang berperan sebagai representasi tabel.(CMIIW).

[System.Data.Services.Common.DataServiceKey("NAMA_FIELD_YANG_MENJADI_PRIMARY_KEY")]

Build dan View in Browser… … Berhasil!

Sekian sentuhan pertama pada Astoria ini, selanjutnya akan diceritakan sentuhan kepada IIS 7 agar ADO.NET Data Service dapat berjalan dengan baik.

Share this post: | | | |