如何透過WCF Data Services呼叫Store Procedure

WCF Data Service 程式設計相關技巧

我想許多人都知道.NET從3.5開始支援REST服務,且REST服務幾乎快紅遍半邊天了,當中WCF Data Services則是其中一種應用,WCF Data Services後端的實際存取資料庫的核心為Entity Framework,相信許多人都比我還熟Entity Framework,所以筆者就不多說了。筆者今天必須透過WCF Data Services來存取SQL Server 2008的Store Procedure,這個Store Procedure其實是個.NET Assembly,因此順道將處理的過程寫一個Sample檔並改以Northwind資料實做一遍記錄下來(已經熟悉的朋友就跳著讀吧^^)。

首先筆者以VS 2010先建立一個空網站:

並加入一個ADO.NET 實體資料模型,並加入「HelloWorld」的預存程序,然後將命名空間設定為「NorthwindModel」:

 

此預存程序為一個.NET Assembly的應用程式,他會傳回一個字串型態的物件,不過這邊在使用Entity Framework呼叫Store Procedure時還須做一些處理,因為Entity Framework在更新資料庫模型時項目如果是Store Procedure或function時並不會自動產生程式碼,若開啟NorthwindModel.Designer.cs起來看,會發現只有「建構函式」與「部分方法」這兩個原先既有的區塊,如下:

這個時候需要到模型瀏覽器NorthwindModelEntityContainer. NorthwindEntities函式匯入 項目上面點選滑鼠右鍵,並選擇「加入函式匯入」,如下圖:

這時會出現「加入函式匯入」對話框,首先選擇預存程序名稱,並將函式名稱設為SP_HelloWorld,然後設定傳回值為純量的String型態,如下設定畫面:

完成後模型瀏覽器馬上會出現SP_HelloWorld這個函式的對應

並且會對 NorthwindModel.Designer.cs產生一段Function Import的程式碼,程式碼中看見我們剛剛設定的SP_HelloWorld方法,如下:

   1: /// <summary>
   2: ///沒有可用的中繼資料文件。
   3: /// </summary>
   4: /// <paramname="greeting">沒有可用的中繼資料文件。</param>
   5: public ObjectResult<global::System.String> SP_HelloWorld(ObjectParameter greeting)
   6: {
   7:  return base.ExecuteFunction<global::System.String>("SP_HelloWorld", greeting);
   8: }

接著對專案加入一個WCF資料服務,引用NorthwindModel與System.Data.Objects,並指定這個資料服務的泛型常式為NorthwindEntities,並將初始化方法InitializeService中的config.SetServiceOperationAccessRule方法的服務使用權限設為”*”,接著就是撰寫程式碼了。筆者撰寫了一個GetHelloWorld()方法並貼上[WebGet()]屬性標籤,程式碼非常的簡單,如下:

   1:  
   2: using System;
   3: using System.Data.Services;
   4: using System.Data.Services.Common;
   5: using System.Collections.Generic;
   6: using System.Linq;
   7: using System.ServiceModel.Web;
   8: using System.Data.Objects;
   9: using NorthwindModel;
  10: using System.ServiceModel;
  11:  
  12: public class WcfSPDataService : DataService<NorthwindEntities>
  13: {
  14:  //只呼叫一次方法初始化全服務原則。
  15:  public static void InitializeService(DataServiceConfiguration config)
  16: {
  17:  // TODO: 設定規則,指出哪些實體集及服務作業可見、可更新等等。
  18:  // 範例:
  19:  // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
  20:     config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
  21:     config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
  22:  }
  23:  
  24: [WebGet()]
  25: public string GetHelloWorld()
  26: {
  27:     NorthwindEntities entity = new NorthwindEntities();
  28:     ObjectResult<string> result = entity.SP_HelloWorld(new ObjectParameter("Greeting", "Gelis"));
  29:     return result.First();
  30:  }
  31: }

程式寫完了,先來測試一下吧!如下圖,WcfSPDataService.svc的執行結果:

 

接著將URL修改一下,加上GetHelloWorld,也就是以REST方式呼叫
http://localhost:1092/WebNorthwindDataServices/WcfSPDataService.svc/GetHelloWorld

如下的執行結果:


 

簽名:

學習是一趟奇妙的旅程

這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。

軟體開發之路(FB 社團)https://www.facebook.com/groups/361804473860062/

Gelis 程式設計訓練營(粉絲團)https://www.facebook.com/gelis.dev.learning/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^